2012-02-16 64 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