我在FileNotFoundException
调用REST API时收到GET
。我得到的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-type
到application/json
。
更新:我尝试使用Burp
,发现标题“接受”,“内容类型”不同。我在iOS应用程序中使用了相同的功能。但它仍然无效。
注意事项:
1)它总是在行in = urlConnection.getInputStream();
上抛出异常
2)我记录了一些东西,根据它,内容长度是114,这不是空的。 content-type是application/json; charser=utf-8
。
答案 0 :(得分:3)
iOS和Android的HTTP流量之间存在差异。这是有保证的,否则您将从服务器获得相同的行为。差异可能在HTTP标头和/或参数中。
通过SO Q& A-E.g远程调试非常困难。我们不知道什么标题& iOS客户端成功使用的参数,以及服务器的配置方式和编程。
如何诊断问题&纠正自己:
diff
相应的文件。推荐的HTTP跟踪工具:
<强>更新强>
似乎您对GET和POST都有同样的问题:服务器配置为BASIC身份验证,但客户端未正确遵循身份验证协议。我认为它只是在两种情况下显示为略有不同的sympton:因为GET它说'资源未找到'&#39; (因为您未经过身份验证),对于POST,资源是由您提供,但服务器表示您无权更改服务器上的资源。我建议你做了足够的(好!)调试请求内容,现在你应该停下来专注于让身份验证工作。
Authorization
标题WWW-Authenticate
标头的401响应提示您进行身份验证(例如WWW-Authenticate: Basic realm="Protected"
请参阅RFC 2617 HTTP Basic Authentication and Digest Authentication)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 ,您就应该能够创建正确的身份验证标头。如果这不起作用,那么您可能在服务器端遇到一些问题。