【问题标题】:Httpclient / JSONObjectHttpclient / JSONObject
【发布时间】:2012-02-16 19:16:37
【问题描述】:

我正在尝试发送 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=/]

【问题讨论】:

    标签: java json httpclient autologin


    【解决方案1】:

    您始终可以通过 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 凭据总是好的。我在下面附上了请求的屏幕截图:

    【讨论】:

    • 我仍然暂时移动 302。
    • 由于某种原因,我仍然暂时移动了 302。
    【解决方案2】:

    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: /' 标头看起来有些可疑,即使自动重定向到该位置也不一定会产生预期的效果。

    【讨论】:

    • 自动登录的任何其他选项或技术?
    • @javaiText:HTTP 中没有自动登录之类的东西。 HTTP 代理必须遵循协议并符合 HTTP 服务器的期望。
    【解决方案3】:

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

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

    【讨论】:

    • 添加了授权 cookie 但仍然是相同的响应。
    【解决方案4】:

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

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

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

    【讨论】:

    • 我在 HttpClient 中没有看到 setFollowRedirect 方法。
    • 哦……我的错……它在 HttpMethod 上(在你的情况下是 httppost)。我将编辑我的答案。
    • 也没有发布。让我检查一下 API。
    • 它存在于较旧的 HTTPClients 中。在 4.x 中,他们移动了它。我在上面贴了一个链接。祝你好运。
    • @ Bob Kuhar:从 2.x 开始,所有 HttpClient 版本的“关注重定向”标志默认开启。 httpost.setFollowRedirect( true ) 基本上没有区别。至于您对 API 更改的赞扬,HttpClient 3.x 完全是一团糟,其中 95% 的协议处理逻辑被塞进一个类,使其成为维护的噩梦。 HttpClient 3.x 终止的原因很简单:没有人愿意维护它。
    猜你喜欢
    • 2011-09-01
    • 1970-01-01
    • 2014-01-03
    • 1970-01-01
    • 2020-01-09
    • 2018-11-14
    • 2018-06-05
    • 1970-01-01
    相关资源
    最近更新 更多