2

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

查看我已经提出的问题,以查看代码和 logcat 屏幕截图以供POST调用。

下面我附上 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.

4

4 回答 4

3

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

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

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

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

推荐的 HTTP 跟踪工具:

更新

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

  1. 向服务器发送不带 Authorization标头的 GET/POST 请求
  2. 允许服务器使用 401 响应来提示您进行身份验证,其WWW-Authenticate标头包含质询字符串(例如,WWW-Authenticate: Basic realm="Protected" 请参阅RFC 2617 HTTP Basic Authentication and Digest Authentication
  3. 现在向服务器发送一个额外的 GET 请求(没有/有原始请求内容),但包括 Authentication 标头,使用 Base 64 编码的 username:password ( Authorization: Basic ZnJhbms6ZmllZGxlcg==)
于 2013-06-19T10:02:27.347 回答
0

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

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

因此,当用户输入正确的凭据时,收到的响应是正确的。而且,如果凭据错误,我的服务器会传递一条错误消息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.

于 2013-06-25T05:06:50.637 回答
0

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

于 2013-06-25T18:14:56.487 回答
0
    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并且您应该能够创建正确的身份验证标头。如果这不起作用,那么您可能在服务器端遇到了一些问题。

于 2013-06-25T21:59:24.967 回答