首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >HttpGet 401状态码,后跟200状态码

HttpGet 401状态码,后跟200状态码
EN

Stack Overflow用户
提问于 2015-01-07 19:34:50
回答 2查看 2.2K关注 0票数 0

我正面临着使用Apachage HttpComponent访问the服务的奇怪行为。

我可以访问服务器日志,当我尝试连接到服务器并执行httpGet命令时,我可以在日志中看到,首先是401状态(http Unauthorized),然后是200状态(http OK)。

这两次尝试发生在"httpClient.execute(httpGet)“期间。

因此,我正在寻找如何避免这种行为。有什么想法吗?

下面是我目前正在使用的代码:

代码语言:javascript
复制
HttpGet httpGet = new HttpGet(this.url + request);

HttpParams httpParameters = new BasicHttpParams();
HttpConnectionParams.setConnectionTimeout(httpParameters,3000);
HttpConnectionParams.setSoTimeout(httpParameters,5000);

DefaultHttpClient httpClient = new DefaultHttpClient(httpParameters);
Credentials creds = new UsernamePasswordCredentials(login, password);
httpClient.getCredentialsProvider().setCredentials(new AuthScope(AuthScope.ANY_HOST, AuthScope.ANY_PORT), creds);

HttpResponse response = httpClient.execute(httpGet);
int status = response.getStatusLine().getStatusCode();
Log.v(this, "Response code status: " + status); // code status = 200 (even if a 401 and then a 200 are visible in the server log).

作为参考,我将此代码用于Android应用程序。

EN

回答 2

Stack Overflow用户

发布于 2015-01-07 19:42:31

这是HTTP客户端的常规行为:发送第一个请求时不进行身份验证。如果服务器返回401,请使用所需的凭据重试。在大多数情况下,web浏览器会提示您输入用户名和密码。由于您已经在代码中提供了凭据,因此可以继续并重试。

您收到的结果是带有凭据的请求之后的响应。

票数 3
EN

Stack Overflow用户

发布于 2015-01-07 21:58:58

为了解决我的问题,我使用了另一个与我的问题相关的问题的答案(Adam Batkin):Preemptive Basic authentication with Apache HttpClient 4 (感谢Bret Okken的链接)。

我终于有了下面这行代码:

代码语言:javascript
复制
httpGet.addHeader(BasicScheme.authenticate(creds, "UTF8", false));

要获得这样的代码,请执行以下操作:

代码语言:javascript
复制
HttpGet httpGet = new HttpGet(this.url + request);

HttpParams httpParameters = new BasicHttpParams();
HttpConnectionParams.setConnectionTimeout(httpParameters,3000);
HttpConnectionParams.setSoTimeout(httpParameters,5000);

DefaultHttpClient httpClient = new DefaultHttpClient(httpParameters);
Credentials creds = new UsernamePasswordCredentials(login, password);
httpClient.getCredentialsProvider().setCredentials(new AuthScope(AuthScope.ANY_HOST, AuthScope.ANY_PORT), creds);

httpGet.addHeader(BasicScheme.authenticate(creds, "UTF8", false));

HttpResponse response = httpClient.execute(httpGet);
int status = response.getStatusLine().getStatusCode();
Log.v(this, "Response code status: " + status);

感谢Thomas Stets有趣的回答。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27818587

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档