我一直在使用HTTPClient 4.1.2版本尝试访问需要基本身份验证的 REST over HTTP API。以下是客户端代码:
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
的文档在这里提到了它。幸运的是,上面链接的答案是一种更简洁和清晰的方式来实现它。