HttpUrlConnection无法正常工作,并显示GET和POST调用的不同状态代码

时间:2013-06-17 06:42:12

标签: java android exception authentication httpurlconnection

我在FileNotFoundException调用REST API时收到GET。我得到的HTTP状态代码是403
对于POST来电,我获得IOException : No authentication challenges found,而我则传递Authorization标头。在这里,我获得了HTTP状态代码401

查看我的already asked question,查看POST来电的代码和logcat屏幕截图。

下面我为GET电话附上了logcat屏幕截图:

enter image description here

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

更新:我尝试使用Burp,发现标题“接受”,“内容类型”不同。我在iOS应用程序中使用了相同的功能。但它仍然无效。

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

4 个答案:

答案 0 :(得分:3)

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

通过SO Q& A-E.g远程调试非常困难。我们不知道什么标题& iOS客户端成功使用的参数,以及服务器的配置方式和编程。

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

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

    <强>更新

    似乎您对GET和POST都有同样的问题:服务器配置为BASIC身份验证,但客户端未正确遵循身份验证协议。我认为它只是在两种情况下显示为略有不同的sympton:因为GET它说'资源未找到'&#​​39; (因为您未经过身份验证),对于POST,资源是由您提供,但服务器表示您无权更改服务器上的资源。我建议你做了足够的(好!)调试请求内容,现在你应该停下来专注于让身份验证工作。

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

答案 1 :(得分:0)

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

我不需要传递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

答案 2 :(得分:0)

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

答案 3 :(得分: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 ,您就应该能够创建正确的身份验证标头。如果这不起作用,那么您可能在服务器端遇到一些问题。