【问题标题】:HttpGet 401 status code followed by 200 status codeHttpGet 401 状态码后跟 200 状态码
【发布时间】:2015-01-07 11:34:49
【问题描述】:

我在使用 Apache HttpComponent 访问网络服务时遇到了一个奇怪的行为。

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

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

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

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

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 应用程序。

【问题讨论】:

标签: java android http get


【解决方案1】:

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

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

【讨论】:

  • 感谢您的回答。有没有办法在第一次请求时强制使用凭证?
  • 不确定。尝试在谷歌上搜索“抢先式身份验证”
【解决方案2】:

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

我终于有了以下行:

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

要获得这样的代码:

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 的有趣回答。

【讨论】:

    猜你喜欢
    • 2019-12-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-13
    • 2018-03-23
    • 1970-01-01
    相关资源
    最近更新 更多