【问题标题】:Android HTTP POST Content-Length ExceptionAndroid HTTP POST 内容长度异常
【发布时间】:2010-09-29 19:02:53
【问题描述】:

我有一个发送 HTTP POST 的简单程序。

httpost.addheader("Content-Length","18")存在时才有效。否则失败。在代码中,它是带有“--->”的行
注释掉这一行会使 POST 成功。

如果该行在代码中,Android 不会发送 POST 并返回协议异常错误。我使用 Wireshark 验证没有发送任何内容。

知道为什么设置 Content-Length 会产生异常吗?

代码:

HttpClient httpclient = new DefaultHttpClient();
HttpPost httppost = new HttpPost("http://test.com/a_post.php");

try {
    List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(2);
    // DATA
    nameValuePairs.add(new BasicNameValuePair("mydata", "abcde"));
    nameValuePairs.add(new BasicNameValuePair("id","29"));

    StringEntity se = new UrlEncodedFormEntity(nameValuePairs);
    httppost.setEntity(se);

    int seLength = (int) se.getContentLength();
    String seLengthStr = Integer.toString(seLength);

    httppost.addHeader("Content-Type","application/x-www-form-urlencoded");
    ----> httppost.addHeader("Content-Length", "18");

    ResponseHandler<String> responseHandler = new BasicResponseHandler();
    String httpResponse=httpclient.execute(httppost, responseHandler);

    responseV.setText(responseV.getText()+ " " + httpResponse);
} catch (ClientProtocolException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
} catch (IOException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
}

【问题讨论】:

  • 堆栈跟踪表明错误是因为 Content-Length 标头已经存在。是这样吗,设置Content-Length的方法是什么?
  • 为什么要手动添加 Content-Length,如果它已经存在?如果您出于某种原因需要更改它,那么它很可能是不正确的,从而导致 HTTP 错误。
  • 在 HttpClient 文档中,它声明 HttpClient 为您设置 Content-length,因此您不必这样做。看了源码,HttpClient实际上是检查是否已经手动添加,如果已经存在则抛出ProtocolException
  • 我也有这个问题,你解决了吗?

标签: android http-post content-length


【解决方案1】:

您确定内容长度正好是 18 吗?我的猜测是,如果代码意识到设置的内容长度不正确,则请求不会完成,因为发送具有无效内容长度的请求将(至少应该)导致服务器出错。

如果您省略内容长度,很可能会在需要时自动添加。

【讨论】:

  • 内容正好是18,mydata=abcde&id=29。
  • Wireshark 还将长度报告为 18。执行 httppost.getallheaders 显示,当未添加内容长度时有 1 个标头,添加内容长度时有 2 个标头。
  • 是的,Apache HTTP Client 会为您添加标头,因此无需添加。我不知道为什么它会导致无用的异常。
  • 谢谢,我会在不添加标头的情况下尝试它,并确保 Web 服务不会抱怨缺少 content-length 标头。
【解决方案2】:

在许多情况下,HTTP 客户端和服务器必须发送Content-Length 标头。它通常不是必需的,包括连接的另一端是否支持 HTTP/1.1。最好简单地忽略该标头,让您的 HTTP 客户端/服务器库处理是否添加标头的逻辑。

【讨论】:

  • 我正在访问的 Web 服务需要内容长度,它需要 POST、CONTENT-TYPE、CONTENT-LENGTH 和 SOAP 数据包。然后必须依靠 Android HTTP 实现来发送内容长度。我将使用 Web 服务对此进行测试并报告。
猜你喜欢
  • 1970-01-01
  • 2013-01-23
  • 1970-01-01
  • 1970-01-01
  • 2012-01-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多