为什么我收到Http / 1.1 400 Bad请求?

时间:2011-04-04 01:37:35

标签: java http httpclient

以下是我的代码片段。我正在尝试使用HTTPOST登录该网站。 我一直得到“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());

感谢您的帮助。

3 个答案:

答案 0 :(得分:7)

如果HTTP服务认为您发送了无效/不正确/不合适,则会发送400响应。无法从您的代码中判断出发送的实际参数是什么,或者(更重要的)服务器期望您发送的内容。

要诊断这一点,您需要:

  • 找出您的代码实际发送的内容,
  • 找出服务器期望您发送的内容。

第二种可能涉及:

  • 查看使用网络浏览器的普通用户发出请求的网页,
  • 查看从服务器获得的400响应的正文
  • 查看服务器日志和/或
  • 查看服务器的Web API文档(或源代码)。

在这种情况下,看起来需要提供额外的token参数。

但是,我怀疑你可能完全采取了错误的做法。 “identi.ca”站点使用StatusNet,其中有两个published APIs用于客户端。没有提及与我能看到的“登录”URL进行交谈。

答案 1 :(得分:6)

查看该登录页面的来源,有一个名为token的隐藏字段,您可能需要返回服务器。您需要首先获取该页面的内容,提取令牌值,并将其包含在POST响应中。

答案 2 :(得分:0)

尽管我知道正确的答案已被标出,但还是想给路过的其他人一些视野。就我而言,这就是导致错误请求的原因

form.add(new BasicNameValuePair("return_url", "https://myexample.example.com/#/providermanageger?vi={VERIFICATION_INTENT_ID}"));

我移除了/#/providermanageger

的那一刻

它开始起作用。因此,请反复尝试。