web-dev-qa-db-ja.com

Http / 1.1 400 Bad requestが表示されるのはなぜですか?

これが私のコードのスニペットです。 HTTPOSTを使用してWebサイトにログインしようとしています。 「400 Bad Request」が何度も表示されるさまざまな組み合わせを試しました。 NameValuePairの代わりにユーザー名/パスワードをヘッダーとして渡してみました。しかし同じ結果。何か足りないものはありますか?

HttpClient httpclient = new DefaultHttpClient();

HttpPost post = new HttpPost("https://identi.ca/main/login");


List <NameValuePair> nvps = new ArrayList <NameValuePair>();
nvps.add(new BasicNameValuePair("nickname", u));
nvps.add(new BasicNameValuePair("password", p));
nvps.add(new BasicNameValuePair("submit", "Login"));

post.setEntity(new UrlEncodedFormEntity(nvps, HTTP.UTF_8));

HttpResponse response = httpclient.execute(post);
HttpEntity entity = response.getEntity();

Log.i("Login form POST result: ", response.getStatusLine().toString());

手伝ってくれてありがとう。

9
chanakya

HTTPサービスは、無効/正しくない/不適切なものを送信したと見なすと、400応答を送信します。コードから、送信される実際の引数が何であるか、または(より重要なのは)サーバーが送信することを期待しているものを知る方法はありません。

これを診断するには、次のことを行う必要があります。

  • あなたのコードが実際に送信しているものを見つけ、そして
  • サーバーが何を送信することを期待しているかを調べます。

2つ目は次のようなものです。

  • webブラウザーを使用する通常のユーザーが要求を行うために使用するWebページを見て、
  • サーバーから受け取った400応答の本文を見て、
  • サーバーログを見る、および/または
  • サーバーのWeb APIドキュメント(またはソースコード)を確認します。

この場合、追加のtokenパラメータを指定する必要があるようです。

しかし、あなたは完全に間違ったアプローチを取っているのではないかと思います。 "identi.ca"サイトは、クライアント用にいくつかの 公開API があるStatusNetを使用します。私が見ることができる「ログイン」URLに話しかけることについての言及はありません。

8
Stephen C

そのログインページのソースを見ると、tokenという非表示フィールドがあり、おそらくサーバーに戻る必要があります。最初にそのページのコンテンツを取得し、トークン値を抽出して、POST応答に含める必要があります。

6
Greg Hewgill