当前位置: 首页 > 面试题库 >

使用基本身份验证时,HTTPClient发送两个请求吗?

党祖鹤
2023-03-14
问题内容

我一直在使用HTTPClient版本4.1.2尝试通过需要基本身份验证的HTTP API访问REST。这是客户端代码:

DefaultHttpClient httpClient = new DefaultHttpClient(new ThreadSafeClientConnManager());
// Enable HTTP Basic Auth
httpClient.getCredentialsProvider().setCredentials(
    new AuthScope(AuthScope.ANY_HOST, AuthScope.ANY_PORT), 
    new UsernamePasswordCredentials(this.username, this.password));

HttpHost proxy = new HttpHost(this.proxyURI.getHost(), this.proxyURI.getPort());

httpClient.getParams().setParameter(ConnRouteParams.DEFAULT_PROXY, proxy);

当我构造一个POST请求时,像这样:

HttpPost request = new HttpPost("http://my/url");
request.addHeader(new BasicHeader("Content-type", "application/atom+xml; type=entry")); // required by vendor
request.setEntity(new StringEntity("My content"));

HttpResponse response = client.execute(request);

我在Charles
Proxy中
看到有两个请求正在发送。一个不带Authorization: Basic ...标题,另一个 标题。如您所料,第一个失败的原因是401,但是第二个失败的情况却是201。

有谁知道为什么会这样吗?谢谢!

编辑:

我应该明确指出,我已经看过这个问题了,但是正如您所看到的,我AuthScope以相同的方式进行设置,但并不能解决我的问题。另外,我HttpClient每次发出请求时都会创建一个新的(尽管我使用相同的ConnectionManager),但是即使我HttpClient对多个请求使用相同的问题,问题仍然存在。

编辑2:

因此,看起来@LastCoder所建议的方法就是这样做。请参阅另一个问题的答案。问题源于我对HTTP规范缺乏了解。我要执行的操作称为“抢先式身份验证”,HttpClient
文档在此提到。值得庆幸的是,上面的答案是一种更短,更简洁的方法。


问题答案:

而不是使用.setCredentials(),为什么不直接编码USERNAME:PASSWORD并使用.addHeader()添加身份验证标头



 类似资料:
  • 我试图将用于需要基本HTTP身份验证的第三方服务。我正在使用。以下是我到目前为止的结论:

  • 问题内容: 我正在尝试在python中使用基本身份验证 响应表单 auth 变量: 但是,当我尝试从其他位置获取数据时-我收到401错误 据我了解-在第二个请求中不是替换的会话参数。 问题答案: 您需要使用会话对象,并向 每个请求 发送身份验证。该会话还将为您跟踪Cookie:

  • 问题内容: 我必须 使用 HTTP Basic身份验证从http服务器下载和解析XML文件。现在,我这样做: 但是以这种方式,我无法从具有http身份验证的服务器获取xml(或者我只是根本不知道该文档)文档。 如果您能向我展示实现我的目标的最好,最简单的方法,我将不胜感激。 问题答案: 您可以使用。例如: 这将设置默认值,并将在 所有 请求中使用。显然,当您不需要所有请求的凭据或多个不同的凭据(可

  • 问题内容: 我想从我的API请求资源时发送身份验证令牌。 我确实使用$ resource实现了服务: 我有一个存储身份验证令牌的服务: 我想通过服务发送的每个请求都发送令牌。通过将其放入特定动作的调用中,我能够发送它。例如,这有效: 但是我宁愿将access_token定义为服务中的参数,因为它必须随每个调用一起发送。并提高干度。但是工厂中的所有内容仅执行一次,因此access_token在定义工

  • 问题内容: 我试图模仿Java中此curl命令的功能: 我使用Commons HttpClient 3.0编写了以下内容,但最终还是从服务器上获取了一个。有人可以告诉我我做错了什么吗? 我后来尝试了Commons HttpClient 4.0.1,但仍然遇到相同的错误: 问题答案: 好的,这样可以工作。万一有人想要它,这是对我有用的版本:)