Я использую HTTPClient версии 4.1.2, чтобы попытаться получить доступ к API REST через HTTP, для которого требуется базовая аутентификация. Вот код клиента:HTTPClient отправляет два запроса при использовании Basic Auth?
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.
Кто-нибудь знает, почему это происходит? Благодаря!
EDIT:
я должен пояснить, что я уже смотрел на this question, но как вы можете видеть, что я установить AuthScope
таким же образом, и это не решить мою проблему. Кроме того, я создаю новый HttpClient
каждый раз, когда я сделал запрос (хотя я использую тот же ConnectionManager
), но даже если я использую тот же HttpClient
для нескольких запросов, проблема все еще сохраняется.
EDIT 2:
Так что, похоже, что @LastCoder предлагал это способ сделать. См. this answer на другой вопрос. Проблема связана с моей нехваткой знаний по спецификации HTTP. То, что я хочу сделать, называется «превентивная аутентификация» и HttpClient
docs mention it here. К счастью, ответ, связанный с выше, является гораздо более коротким и более чистым способом сделать это.
Я заметил то же самое, что и при использовании soap-ui, хотя были указаны учетные данные. – Harindaka
Мне интересно, действительно ли это нормальное поведение. Клиент делает HTTP-запрос, не предполагая какого-либо авторизации, и затем сообщается (через 401), что необходим базовый auth. Теоретически базовый auth может быть выполнен превентивно, но другие схемы аутентификации (например, дайджест) нуждаются в дополнительных переговорах – seand
@seand. Вы знаете, что я действительно это рассматривал, но я не знаю, встроено ли это в протокол HTTP или что-то в этом роде. – daveslab