HttpPost с заголовком, файлами cookie, параметрами — 417 — ожидание не выполнено

Хорошо, это будет длинно, так что спасибо всем, кто читает это до конца.

Условие: я не могу получить доступ к серверу, я просто пытаюсь опубликовать данные в качестве комментария к новостям.

Я отчаянно проверяю это уже пару часов, но до сих пор не добился успеха. Мне в основном нужен такой запрос:

POST http://www.example.com/gen/processtalkback.php
Cookie: userid=XXXX; password=XXXX
Content-Type: application/x-www-form-urlencoded
reference_id=XXXX&talkback_command=newentry&talkback_content=comment&talkback_viewpage=1&reference_area=11

Так что ничего особенного, просто два заголовка с двумя файлами cookie, дескриптор контента и пять параметров. Два файла cookie являются обязательными, поэтому я установил их следующим образом:

CookieStore cookieStore = httpClient.getCookieStore();

BasicClientCookie cookie = new BasicClientCookie("userid", "XXXX");
cookie.setDomain("http://www.example.com");
cookieStore.addCookie(cookie);

BasicClientCookie cookie2 = new BasicClientCookie("password", "XXXX");
cookie2.setDomain("http://www.example.com");
cookieStore.addCookie(cookie2);

После этого я устанавливаю заголовок и содержимое объекта HttpPost и выполняю его:

HttpPost httpost = new HttpPost("http://www.example.com/gen/processtalkback.php");
httpost.setHeader("Content-Type", "application/x-www-form-urlencoded");
List<NameValuePair> nvps = new ArrayList<NameValuePair>(5);
nvps.add(new BasicNameValuePair("reference_id", "XXXX"));
...
httpost.setEntity(new UrlEncodedFormEntity(nvps));

HttpResponse httpResponse = httpClient.execute(httpost);

Я смотрю на ответ, и он показывает мне:

Log.i("RESPONSE", httpResponseActivity.getStatusLine() + EntityUtils.toString(httpResponse .getEntity()));

HTTP/1.1 417 Expectation Failed
<?xml version="1.0" encoding="iso-8859-1"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
    <head>
     <title>417 - Expectation Failed</title>
    </head>
    <body>
     <h1>417 - Expectation Failed</h1>
    </body>
</html>

Я действительно не знаю, в чем проблема. С расширениями Firefox, такими как «плакат» или «HttpRequester», мне удается опубликовать:

POST http://www.example.com/gen/processtalkback.php
Cookie: userid=XXXX; password=XXXX
Content-Type: application/x-www-form-urlencoded
reference_id=XXXX&talkback_command=newentry&talkback_content=comment&talkback_viewpage=1&reference_area=11

200 OK
X-Powered-By:  PHP/5.3.6
Set-Cookie:  ...
Expires:  Thu, 19 Nov 1981 08:52:00 GMT
Cache-Control:  no-store, no-cache, must-revalidate, post-check=0, pre-check=0
Pragma:  no-cache
Content-Type:  text/html; charset=utf-8
Transfer-Encoding:  chunked
Date:  Sun, 07 Aug 2011 16:24:01 GMT
Server:  lighttpd/1.4.22
 <a name="commentanchor"></a>
...

Я также пробовал это с объектом Parameter, но все равно безуспешно:

HttpParams params = new BasicHttpParams();          
params.setParameter("reference_id", "XXXX");
...
httpost.setParams(params);

Что может быть причиной проблемы? Я что-то упускаю? Какие-либо особенности Apache HttpClient, о которых я не знаю? Я знаю о том, что сервер что-то говорит мне этим сбоем, поэтому я поискал в Интернете и попробовал одно из решений для этого:

params.setBooleanParameter("http.protocol.expect-continue", false);

До сих пор нет успеха.

Что я получил от прослушки приложением "акула для рута" без этого параметра:

Data:
POST /gen/processtalkback.php
HTTP/1.1
Content-Type: application/x-www-form-urlencoded
Content-Length: 119
Host: www.example.com
Connection: Keep-Alive
User-Agent: Apache-HttpClient/UNAVAILABLE (java 1.4)
Expect: 100-Continue

HEX: .....

А теперь с параметром:

Data:
POST /gen/processtalkback.php
HTTP/1.1
Content-Type: application/x-www-form-urlencoded
Content-Length: 119
Host: www.example.com
Connection: Keep-Alive
User-Agent: Apache-HttpClient/UNAVAILABLE (java 1.4)
reference_id=XXXX...............

HEX: .....

Что я получил от firebug из публикации в браузере:

Host    www.example.de
User-Agent  Mozilla/5.0
Accept  text/javascript, text/html, application/xml, text/xml, */*
Accept-Language en-us,de-de;q=0.8,en;q=0.5,de;q=0.3
Accept-Encoding gzip, deflate
Accept-Charset  ISO-8859-1,utf-8;q=0.7,*;q=0.7
DNT 1
Connection  keep-alive
X-Requested-With    XMLHttpRequest
X-Prototype-Version 1.7
Content-Type    application/x-www-form-urlencoded; charset=UTF-8
Referer ...
Content-Length  134
Cookie  ...
Pragma  no-cache
Cache-Control   no-cache

Почему файлы cookie не отображаются при моих программатических попытках httppost? Было бы здорово, если бы у кого-то была идея. :-)


person einschnaehkeee    schedule 07.08.2011    source источник


Ответы (2)


Получил работу с другим подходом. Я использовал этот код публикации на немецком форуме: http://www.android-hilfe.de/android-app-entwicklung/6398-http-post-request-mit-cookie.html

Так что я в основном должен был написать

URL url = new URL("http://www.example.com/gen/processtalkback.php");

HttpURLConnection connection = (HttpURLConnection) url.openConnection();
connection.setDoOutput(true);
connection.setRequestMethod("POST");
connection.setRequestProperty("Cookie", "userid=XXXX; password=XXXX");
connection.connect();

Свалка акул:

Data:
POST /gen/processtalkback.php
HTTP/1.1
cookie: userid=XXXX; password=XXXX
User-Agent: Dalvik/1.2.0 (Linux; U; Android 2.2.2; ...
Host: www.example.com
Connection: Keep-Alive
Content-Type: application/x-www-form-urlencoded
Content-Length: 119

HEX: .....

Содержание сообщения было отправлено отдельно:

Data:
reference_id=XXXX&talkback_command=newentry&talkback_content=comment&talkback_viewpage=1&reference_area=11

HEX: .....

И это сработало отлично! Я действительно смущен, почему этот подход был успешным в самый первый раз, и попытки его с Apache HttpClient в течение нескольких часов привели к тому, что я буквально рвал на себе волосы.

Кто-нибудь знает подробности? Я был бы очень признателен за любое объяснение.

person einschnaehkeee    schedule 08.08.2011

У меня была такая же проблема на Android 2.2 (работало без них для Android > 2.2). У меня работало только при использовании обоих параметров, например:

HttpParams params = new BasicHttpParams();          

params.setParameter("reference_id", "XXXX");
params.setBooleanParameter("http.protocol.expect-continue", false);

httpost.setParams(params);
person Sferus    schedule 01.08.2012