Я использовал 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
документах это упоминается здесь . К счастью, ответ, связанный с приведенным выше, является гораздо более коротким и понятным способом сделать это.