2011-08-07 20 views
3

これは長いものなので、これを最後まで読んでいるすべての人にとっては良いでしょう。ヘッダ、クッキー、パラメータ付きHttpPost - 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 

ので何も、2枚のクッキーとコンテンツdiscriptorとの5つのパラメータを持つだけで2つのヘッダ:私は基本的に必要なのは、要求のこの種です。 2枚のクッキーは必須ですので、私はこのようにそれらを設定します。その後

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> 

私は本当に何が問題なのか分かりません。 「ポスター」または「HttpRequester」のようなFirefoxの拡張機能は、私が投稿して成功すると:

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の詳細は?私は、サーバーが私にこの障害によって何かを語っているという事実を認識していないので、私は、Webで検索し、このためのソリューションのいずれかを試してみました:

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: ..... 

私は、このパラメーターを指定せずにアプリ「rootのサメ」によって盗聴から得たもの

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 

プログラムによるhttpsostの試行でCookieが表示されないのはなぜですか?もし誰かがアイデアを持っていれば素晴らしいだろう。 :-)

答えて

3

別のアプローチで動作しました。私はドイツのフォーラムの投稿のこのコードを使用:私は基本的に書かなければならなかったので、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: 
reference_id=XXXX&talkback_command=newentry&talkback_content=comment&talkback_viewpage=1&reference_area=11 

HEX: ..... 

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: ..... 

ポストコンテンツは別々に送りました

それは完璧に働いた! 私はこのアプローチが初めて成功した理由を本当に混乱させ、Apache HttpClientを数時間試してみると文字通り私の髪の毛が裂けました。

誰もが詳細を知っていますか?私は非常に説明を感謝します。

2

私は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); 
関連する問題