簡體   English   中英

使用Basic Auth時,HTTPClient會發出兩個請求嗎?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM