3

我正在尝试自动登录发送 JSONObject。我将 reposnse 设置为 302 Moved Temporarily 这意味着我应该重定向到另一个 url。但我的 response.toString() 显示“位置:/”。下面是代码。

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=/]
4

4 回答 4

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 凭据总是好的。我在下面包含了请求的屏幕截图:

在此处输入图像描述

于 2012-02-16T19:29:16.493 回答
1

HttpClient 4.x 使用的默认重定向策略遵守 HTTP 规范对 POST 和 PUT 等实体封闭方法的自动重定向的限制。根据 HTTP 规范的要求,在没有用户明确确认的情况下302 Moved Temporarily, POST301 Moved Permanently307 Temporary RedirectPUT 方法的状态代码可能不会自动处理。

HttpClient 4.2 可以配置为使用LaxRedirectStrategy自动处理所有类型的重定向,而不管规范施加的限制。使用早期版本,可以实现自定义重定向策略,如下所述:Httpclient 4,错误 302。如何重定向?(正如鲍勃库哈尔所建议的那样)。

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

于 2012-02-17T11:47:48.457 回答
0

您可以只配置您的 HTTPClient 以遵循重定向。在 4.x 之前,它只是 HTTPMethod 上的一个方法。添加...

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

...但这还不够纯净或其他什么,他们在 4.x 中对其进行了更改。从那以后我没有尝试过,所以不愿意发布代码。但是这个问题已经出现并在这里得到了回答。也许这对你有帮助? Httpclient 4,错误 302。如何重定向?

于 2012-02-16T19:47:20.650 回答
0

response HTTP/1.1 302 Moved Temporarily 意味着发生了一些重定向。

示例案例之一是,需要单点登录(或)授权。当您尝试使用 URL 访问资源时,如果没有授权 cookie,您可能会被重定向到授权,响应为 302。

于 2012-02-16T19:22:20.373 回答