【问题标题】:HTTP File Download 500 internal server errorHTTP 文件下载 500 内部服务器错误
【发布时间】:2013-01-29 19:34:25
【问题描述】:

我正在编写一个 Android 应用程序,它与我们公司的 iPad 应用程序完全相同。但是我在 android 上开发时遇到了 1 个问题。该应用程序从网络服务器下载文件。它会调用如下 URL:

https://www.somedomain.com/API/Download.aspx?param1=test&param2=test2 等等...

在 iPad 上这是完美的(我为此使用了 ASIHTTPRequest 类)。但在 Android 上,它只会给我带来问题。

只要我想用 android 下载文件,它就会下载一个包含 500 内部服务器错误 HTML 文档的文件,而不是 PDF 文件。

我检查了 URL,它们看起来与 iPad 上的完全一样。

我唯一能想象的是,用户下载的文件是“即时”创建的。因此生成文件需要一些时间(10 或 20 秒),然后文件正在下载。

在安卓上我这样做:

我有一个扩展类:

extends AsyncTask<String, Integer, JSONObject>

在一个方法中,我这样做:

HttpClient httpclient = new DefaultHttpClient();
HttpGet httpget = new HttpGet(url);
HttpResponse response = httpclient.execute(httpget);

InputStream data = response.getEntity().getContent();       
File file = new File(context.getDir("docs", Context.MODE_PRIVATE), FileName);

OutputStream output = new FileOutputStream(file);
ByteStreams.copy(data, output);
Closeables.closeQuietly(output);

但这给了我一个 500 内部服务器错误文档,而不是所需的 PDF 文件。我在这里想念什么? (抱歉,我刚开始为 Android 开发,所以我不是这种情况的专家 ;-))

提前致谢!

【问题讨论】:

  • 我很愚蠢,将其更改为 HTTPGet 但没有区别...
  • 您需要发送什么样的标头?例如,Accept 标头会有所作为。服务器是否返回 302 重定向到文件?我怀疑这是 HttpGet 与 ASIHTTPRequest 的默认请求参数的差异。另外,您的代码是否适用于其他 URI?
  • 我不需要发送特定的标头。在 iPad 上,我只调用 URL,仅此而已......我尝试了一个简单 JPG 图像的代码,但同样有效,然后文件在调用 URL 时存在,并且我调用的 API 生成即时文件...
  • 我也尝试了一些其他方法,然后我得到一个异常告诉我“FileNotExistsException”,这也是我认为设备请求太快的原因
  • @BalusC 你是如何识别出它是一个 POST 请求而不是一个 get 请求?

标签: android eclipse


【解决方案1】:

您的服务器响应状态代码是问题的事实意味着这应该与 Android 的东西无关,而只与您发送的请求有关。我注意到,尽管这可能是由于故意遗漏,您正在执行 POST 请求而没有添加任何 POST 参数。这应该是 GET 吗?我注意到端点是一个 ASPX 路径,查询字符串中有 GET 参数。也许您的服务器设置为仅响应 GET 而不是 POST。这是如何在 iOS 代码中完成的? GET 和 POST 之间没有区别,还是通过您正在使用的库从您那里抽象出来的?

【讨论】:

  • 将其更改为 HTTPGet,同样的问题... iPad 运行良好,使用相同的 URL,因此它与来自 Android 的请求有关,服务器运行良好.. 但是什么是真的吗?我不熟悉 android HTTP 的东西,所以也许我遗漏了一些东西......
  • 如果你的目标是 Android 2.2+,你可以使用 AndroidHttpClient client = AndroidHttpClient.newInstance([user agent string]);而不是实例化 DefaultHttpClient。该类只是为 HttpClient 实现包装了一些优化的默认设置。不确定这是否会立即解决您的问题,但这是一个开始。在您在两个平台上发送它之前,我还会检查它存在的确切 URL。也许您在参数上缺少一些 URL 编码?请记住,500 状态意味着错误正在服务器上发生......所以它必须是请求。
  • 好的,我试过 AndroidHttpClient,结果一样。我检查了两台设备上的 URL,完全相同和相同的编码,所以这不会是问题......我认为问题是服务器需要一些时间来生成文件,然后才能做出反应,而 android 中的 HTTP 客户端是等不及了……
  • 如果是服务器超时,你会得到一个服务器超时异常。当服务器返回 500 错误时,这意味着服务器上发生了异常。除非您在服务器上使用不符合标准的框架或手动执行一些奇怪的操作来生成该状态代码,否则服务器上会引发异常。您是否在服务器上记录任何内容?我向您保证,如果您从任何正常的 Web 框架获取 HTTP 500 状态代码,服务器上就会发生错误,这与 Android 等待时间不够长无关。
【解决方案2】:

好的,它现在可以工作了……愚蠢的事情……我不断地创建一个新的 HttpClient,因此会话不会存储在连接之间。这就是服务器返回 500 内部服务器错误的原因,因为服务器不知道用户...

感谢大家的帮助!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-02-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多