Я понял это, и я кое-чему научился сегодня.
Короче говоря: отключите HTTP Post expect-continue
рукопожатие HttpClient, установив один из его параметров , это отправит сообщение с запросом целиком в один блок.
//set up HttpPost request as before
HttpClient client = new DefaultHttpClient();
client.getParams().setBooleanParameter("http.protocol.expect-continue", false);
HttpResponse response = client.execute(request);
[...]
Теперь вот как я туда попал, может, это кому-нибудь когда-нибудь поможет.
Сначала я получил от HttpEntityWrapper
и использовал его как свою сущность запроса, чтобы увидеть, что вызывается, когда, и обнаружил, что метод Entity
writeTo(OutputStream)
вообще никогда не вызывался .
Затем я начал смотреть, почему в случае «правильного» поведения запрос POST не отправлялся сразу, а вместо этого отправлялись заголовки запроса, затем получался заголовок ответа, ТОГДА тело запроса отправлено.
Все это связано с HTTP Post expect-continue
рукопожатием. Узнайте больше об этом на Haacked .
Если в запросе отправляется заголовок ожидаемого продолжения, сервер Http ДОЛЖЕН ответить сообщением 100 Continue
, означающим «ОК, я приму ваше сообщение», или с ошибкой, остановив, возможно, длинное сообщение POST на его дорожках.
К сожалению, веб-сервер, с которым я работаю, является простой реализацией, работающей на чипе, и отправляет неправильный ответ (200 OK
вместо 100 Continue
).
Реализация .NET Http-клиента по умолчанию выглядит здесь более простительно: он обрабатывает сообщение 200
как 100 Continue
, пожимает плечами и получает возможность отправить тело запроса.
Не так с реализацией Http-клиента Android (уровень API 7).
Затем я попытался полностью отключить рукопожатие expect-continue
, чтобы HttpClient отправил весь запрос. К моему удивлению и радости, веб-сервер прекрасно справился с этой задачей и ответил с информацией, которую я хотел. Ура!