[英]HTTPClient sends out two requests when using Basic Auth?
我一直在使用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
文檔在這里提到它 。 值得慶幸的是,與上述相關的答案是一種更簡潔,更簡潔的方法。
而不是使用.setCredentials()為什么不編碼USERNAME:PASSWORD並使用.addHeader()添加身份驗證標頭
這意味着您的服務器/目標端點正在為每個客戶端請求創建一個新會話。 這會強制您的每一個請求都經過一次握手,這意味着客戶首先撥打電話並意識到需要授權,然后是授權。 您需要做的是搶先發送授權,如下所示:
httpClient.getParams()setAuthenticationPreemptive(真)。
只是為了理解您可以記錄客戶端請求標題的過程,讓您了解客戶端發送和接收的內容:看看是否有效。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.