Android HTTP POST Исключение длины содержимого
У меня есть простая программа, которая отправляет 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();
}
2 ответа
Вы уверены, что длина контента ровно 18? Я предполагаю, что запрос не будет выполнен, если код поймет, что заданная длина содержимого неверна, так как отправка запроса с недопустимой длиной содержимого будет (по крайней мере, должна вызывать ошибку на сервере).
Скорее всего, если вы опустите длину содержимого, она будет добавлена автоматически при необходимости.
Существует ряд условий, когда HTTP-клиенты и серверы не должны отправлять Content-Length
заголовок. Часто это не требуется, в том числе если другая сторона соединения поддерживает HTTP/1.1. Лучше всего просто оставить этот заголовок и позволить вашей клиентской / HTTP-библиотеке HTTP обрабатывать логику того, добавлять ли заголовок.