0

HTTP POST を送信する単純なプログラムがあります。

行が存在しない場合にのみ機能します。それ以外の場合は失敗します。コードでは、「--->」の 行です。この行をコメントアウトすると、POST が成功します。httpost.addheader("Content-Length","18")

その行がコード内にある場合、Android は POST を送信せず、Protocol Exception エラーを返します。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();
}
4

2 に答える 2

1

content-length が正確に 18 であると確信していますか? 私の推測では、設定された content-length が正しくないことをコードが認識した場合、リクエストは実行されません。無効な content-length を指定してリクエストを送信すると、(少なくとも) サーバーでエラーが発生するはずです。

ほとんどの場合、コンテンツの長さを省略した場合、必要に応じて自動的に追加されます。

于 2010-09-29T19:08:20.567 に答える
0

HTTP クライアントとサーバーがヘッダーを送信してはならない条件がいくつかあります。Content-Length接続の反対側が HTTP/1.1 に対応している場合など、多くの場合は必要ありません。そのヘッダーをそのままにして、ヘッダーを追加するかどうかのロジックを HTTP クライアント/サーバー ライブラリに処理させるのが最善の方法かもしれません。

于 2010-09-29T20:34:54.457 に答える