2012-02-16 33 views
3

我想自动登录发送一个JSONObject。我得到302临时移动,这意味着我应该重定向到另一个网址。但是我的response.toString()显示“Location:/”。以下是代码。Httpclient/JSONObject

String input_text = "https://www.hautelook.com/v3/credential"; 
HttpPost httpost = new HttpPost(input_text); 
String data = "{\"screen_resolution\":{\"height\":1080,\"width\":1920}}"; 

JSONObject jo=new JSONObject(); 
jo.put("email","sfhgfjk"); 
jo.put("passsword","dfjhsdkj"); 
jo.put("meta",data); 

StringEntity se = new StringEntity("JSON: " + json.toString()); 
se.setContentEncoding("UTF-8"); 
se.setContentEncoding(new BasicHeader(HTTP.CONTENT_TYPE, "application/json")); 
httpost.setEntity(se); 

HttpResponse response = httpclient.execute(httpost); 
entity = response.getEntity(); 

会出现什么问题?

这是回应。

response HTTP/1.1 302 Moved Temporarily [Server: nginx, Content-Type: text/html, 
Location: /, Content-Encoding: gzip, Content-Length: 20, Expires: Thu, 16 Feb 2 
012 19:07:55 GMT, Cache-Control: max-age=0, no-cache, no-store, Pragma: no-cache 
, Date: Thu, 16 Feb 2012 19:07:55 GMT, Connection: keep-alive, Set-Cookie: PHPSE 
SSID=vmoqeksits8ccukvnf7k4rdv75; path=/] 

回答

0

response HTTP/1.1 302 Moved暂时表示发生了一些重定向。

其中一个例子是单点登录(或)需要授权。当您尝试使用URL访问资源时,如果没有授权Cookie,您可能会被重定向为授权,响应为302.

+0

添加授权cookie,但仍然是repsonse。 – JNPW 2012-02-16 19:34:32

2

您可以随时通过CURL或甚至浏览器发出请求来手动验证这是否正确。例如,在浏览器地址栏中输入https://www.hautelook.com/v3/credential会导致重定向到https://www.hautelook.com(jQuery会显示一个很好的小登录对话框)。所以你至少知道,行为是一致的。

这可能意味着几件事情之一:

  • 您正在使用的端点是不正确的(这可能不是 情况下)
  • 您提供认证信息是不正确的(也 可能性不大,因为我们预计在这种情况下401未经授权)
  • 您传递身份验证信息的方式不正确。

不知道更多关于API它很难说,但你应该再次咨询文档,以确保您正确拨打电话。


*编辑*

好,用REST客户端测试,有一些事情在你的代码来纠正:

  • 更改 '密码时应' 到 '密码'
  • 换行:

原创:

new StringEntity("JSON: " + json.toString()) 

要:

new StringEntity(json.toString()) 

应通过允许请求,但我仍然不知道这是正确的终点,因为我回来的HTML页面。最后一件事是,在将您的代码发布到SO之前,它总是很好地移除您的API凭证。我包括下面的请求的截图:

enter image description here

+0

我还在临时搬家302。 – JNPW 2012-02-16 20:21:25

+0

由于某种原因我仍然302临时移动。 – JNPW 2012-02-16 22:18:15

0

你可以只配置了HTTPClient跟随重定向。在4之前。x,它只是HTTPMethod中的一种方法。添加...

HttpPost httpost = new HttpPost(input_text); 
httpost.setFollowRedirect(true); 

...但这不够纯或什么,他们改变它在4.x.我没有尝试过,所以不愿意发布代码。但是这个问题已经提出并且在这里得到了回答。也许这对你有帮助? Httpclient 4, error 302. How to redirect?

+0

我在HttpClient中看不到setFollowRedirect方法。 – JNPW 2012-02-16 19:54:24

+0

哦...我的坏...它在HttpMethod(在你的情况下的httppost)。我会编辑我的答案。 – 2012-02-16 19:57:42

+0

不在后。让我检查API。 – JNPW 2012-02-16 20:03:08

1

HttpClient 4.x使用的默认重定向策略限制HTTP规范施加的实体封闭方法(如POST和PUT)的自动重定向限制。根据HTTP规范302 Moved Temporarily301 Moved Permanently307 Temporary Redirect的要求,在没有用户明确确认的情况下,POST和PUT方法可能不会自动处理状态码。

HttpClient 4.2可以配置为使用LaxRedirectStrategy,它可以自动处理所有类型的重定向,而不受规范限制。使用早期版本,可以实现自定义重定向策略,如下所述:Httpclient 4, error 302. How to redirect?(如Bob Kuhar所建议的)。

同时我不得不说,'Location: /'头看起来有点可疑,甚至自动重定向到该位置可能不一定产生预期的效果。

+0

自动登录的其他选项或技巧? – JNPW 2012-02-17 15:23:41

+0

@javaiText:在HTTP中没有自动登录这样的事情。 HTTP代理必须遵循协议并符合HTTP服务器的期望。 – oleg 2012-02-17 16:39:17