【问题标题】:HttpUrlConnection not working and shows different status code for GET and POST callHttpUrlConnection 不工作,并为 GET 和 POST 调用显示不同的状态代码
【发布时间】:2013-06-17 06:42:11
【问题描述】:

在对 REST API 进行 GET 调用时,我收到了 FileNotFoundException。我在这里得到的 HTTP 状态码是403
对于POST 调用,我得到IOException : No authentication challenges found,而我通过Authorization 标头。在这里,我得到 HTTP 状态代码 401

查看我的 already asked question 以查看 POST 调用的代码和 logcat 屏幕截图。

下面我附上 GET 调用的 logcat 屏幕截图:

注意:
1) 我尝试过使用Authenticator
2) 尝试了不同的 base64 标志,例如 NO_WRAP、URL_SAFE、DEFAULT。
3) 我对www.google.com 的简单调用有效。
4) 当我登录urlConnection.getErrorStream() 时,会打印图像中的最后一行。我不明白那是什么,它是什么意思。我在标题中指定了Content-typeapplication/json

更新:我尝试使用Burp,发现标题“Accept”、“Content-type”不同。我使用与iOS应用程序相同的方法。但它仍然不起作用。

注意事项:
1) 它总是在in = urlConnection.getInputStream(); 行抛出异常。
2)我记录了一些东西,根据它,内容长度是114,这不是空的。内容类型是application/json; charser=utf-8

【问题讨论】:

  • 也许服务器提供了一个 gzip(压缩)答案,而 lib 无法读取该流。
  • @TeTeT 好的。我认为服务器不会发送 gzip,因为我在 iOS 应用程序中使用相同的 API 来获得 JSON 响应。即使服务器发送它,为什么我得到 FileNotFoundException 和“未找到身份验证挑战”?任何的想法。顺便说一句,谢谢。
  • 我试过你的代码,我得到的只是404 : Invalid requested action ERROR_INVALID_ACTION_REQUEST 的 URL http://api.ridesharebuddy.com/rsmobile/user/。是好网址吗?
  • @Raphaël 该 URL 不足以发出请求。您必须将方法设置为 GET 并传递我没有在代码中显示的 2 个标头,因为它们与问题没有任何关系。顺便说一句,我解决了这个问题并将作为答案,以便其他有类似问题的人可以尝试。
  • 我认为拉斐尔是对的

标签: java android exception authentication httpurlconnection


【解决方案1】:

iOS 和 Android 的 HTTP 流量存在差异。这是有保证的,否则您将从服务器获得相同的行为。区别可能在于 HTTP 标头和/或参数。

这很难通过 SO Q&A 远程调试 - 例如。我们不知道您的 iOS 客户端成功使用了哪些标头和参数,也不知道您的服务器是如何配置和编程的。

如何诊断问题并自行纠正:

  1. 跟踪您的工作 HTTP 流量:iOS 客户端 服务器
  2. 跟踪您的非工作 HTTP 流量:Android 客户端 服务器
  3. 比较 (2) 和 (3)。为了进行最彻底的比较,请将每个 HTTP 请求和响应消息保存为 (2) 和 (3) 的单独文件,然后将 diff 保存为相应的文件。

推荐的 HTTP 跟踪工具:

更新

似乎您对 GET 和 POST 都有相同的问题:服务器配置为 BASIC 身份验证,但客户端未正确遵循身份验证协议。我认为它只是在两种情况下显示为略有不同的症状:对于 GET,它说“找不到资源”(因为你没有经过身份验证),对于 POST,资源是 由你提供的,但是服务器说您无权更改服务器上的资源。我建议您已经对请求内容进行了足够的(很好!)调试,现在您应该停止并专注于使身份验证正常工作。

  1. 向服务器发送 GET/POST 请求 Authorization 标头
  2. 允许服务器使用 401 响应提示您进行身份验证,该响应带有包含挑战字符串的 WWW-Authenticate 标头(例如 WWW-Authenticate: Basic realm="Protected" 参见 RFC 2617 HTTP Basic Authentication and Digest Authentication
  3. 现在向服务器发送一个额外的 GET 请求(不带/带原始请求内容),但包含 Authentication 标头,使用 Base 64 编码的用户名:密码 (Authorization: Basic ZnJhbms6ZmllZGxlcg==)

【讨论】:

  • 干得好。谢谢。 :-) 你看到 Burp 的响应消息了吗?
  • 我只在 Burp 中看到了请求。我是否需要对设置进行任何更改才能看到响应?感谢您继续提供帮助。
  • 我可以查看响应。它总是与 coe 408 超时。昨天在使用代理服务器时我也遇到了这个问题。如果我关闭代理服务器,那么我永远不会超时并得到我的问题中描述的异常。
  • 当您看到显示的请求消息时,在拦截选项卡上单击转发。这会将请求发送到服务器,服务器返回响应,然后 Burp 应显示该响应。
  • 我必须对设置进行一些更改,我做到了。请查看我之前的评论以获取更新。
【解决方案2】:

我解决了我的问题,这是我在解决问题时从未尝试关注的事情。

我不需要传递Authorization 标头。问题是图片中有 2 个凭据。一是服务器的授权,二是login API 的凭据。在我的应用程序中,用户创建一个帐户并登录它。为了验证用户身份,我将凭据传递给服务器,然后服务器对其进行身份验证。

因此,当用户输入正确的凭据时,收到的响应是正确的。而且,如果凭据错误,我的服务器会传递一条错误消息You are not authorized person,我想将其显示给用户(就像在我的 iOS 应用程序中一样)。所以问题出在 HTTP 状态代码(如果凭据错误)是 401,这就是为什么我没有收到服务器发送的消息(并收到 No authentication challenges found 消息)。

我没有收到服务器消息的原因是HttpUrlConnection don't give server response when HTTP status code is >= 400

在状态码 400 及以上的情况下获取错误详细信息的唯一选择是使用 getErrorStream() 方法并使用该方法我正在接收 No authentication challenges found 消息。

最后,要么我必须在客户端处理每个状态码,即等于或高于 400,要么我可以使用HttpClient,而不是HttpUrlConnection。现在我要转到HttpClient

【讨论】:

    【解决方案3】:

    我遇到了类似的问题,并通过传递经过身份验证的会话 cookie 来解决。不确定您的情况是否可行。

    【讨论】:

      【解决方案4】:
          AuthUser="foobar"
          AuthPass="password"
          URL targetUrl = new URL("http://www.google.com/");
          HttpURLConnection connection = (HttpURLConnection) targetUrl.openConnection();
          connection.setRequestMethod("GET");
          connection.setDoInput(true);
          String authStr = Base64Variants.MIME_NO_LINEFEEDS.encode((AuthUser+":"+AuthPass).getBytes());
          connection.addRequestProperty("Authorization", "Basic "+authStr);
          InputStream inputStream= connection.getInputStream();
      

      我只是运行这样的东西,它对我来说非常有效。只要确保您使用 Base64Variants.MIME_NO_LINEFEEDS,您应该能够创建正确的身份验证标头。如果这不起作用,那么您可能在服务器端遇到了问题。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-08-18
        • 2022-01-08
        • 1970-01-01
        • 2014-06-06
        相关资源
        最近更新 更多