HTTPClient отправляет два запроса при использовании базовой аутентификации?

Я использовал HTTPClient версии 4.1.2, чтобы попытаться получить доступ к REST через 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 , что отправляются два запроса. Один без Авторизация: Базовая ... и один с . Первый не работает с 401, как и следовало ожидать, но второй проходит нормально с 201.

Кто-нибудь знает, почему это происходит? Спасибо!

РЕДАКТИРОВАТЬ:

Я должен прояснить, что я уже рассматривал этот вопрос , но, как вы можете видеть, я установил AuthScope таким же образом, и он не реши мою проблему.Кроме того, я создаю новый HttpClient каждый раз, когда делаю запрос (хотя я использую тот же ConnectionManager ), но даже если я использую тот же HttpClient для несколько запросов, проблема не устранена.

РЕДАКТИРОВАТЬ 2:

Похоже, что @LastCoder предлагает правильный способ. См. этот ответ на другой вопрос. Проблема проистекает из моего незнания спецификации HTTP. То, что я хочу сделать, называется «упреждающей аутентификацией», и в HttpClient документах это упоминается здесь . К счастью, ответ, связанный с приведенным выше, является гораздо более коротким и понятным способом сделать это.

13
задан Community 23 May 2017 в 12:02
поделиться