6

У меня есть приложение, подключающееся к сайтам, которым требуется базовая аутентификация. Сайты предоставляются во время выполнения и не известны во время компиляции.HttpClient 4.2, Basic Authentication и AuthScope

Я использую HttpClient 4.2.

Я не уверен, что приведенный ниже код заключается в том, как я должен указывать базовую аутентификацию, но документация предполагает, что это так. Однако я не знаю, что передать в конструкторе AuthScope. Я думал, что нулевой параметр означает, что предоставленные учетные данные должны использоваться для всех URL-адресов, но он выбрасывает NullPointerException, поэтому я явно ошибаюсь.

m_client = new DefaultHttpClient(); 
UsernamePasswordCredentials credentials = new UsernamePasswordCredentials(m_userName, m_password); 
((DefaultHttpClient)m_client).getCredentialsProvider().setCredentials(new AuthScope((HttpHost)null), credentials); 
+0

client.getCredentialsProvider(). setCredentials ( новый AuthScope (proxyHost, proxyPort), новый UserPasswordCredentials (proxyUser, proxyPassword)); Это правильный путь – MayurB

ответ

8

AuthScope.ANY является то, что вы после: http://hc.apache.org/httpcomponents-client-ga/httpclient/apidocs/org/apache/http/auth/AuthScope.html

Попробуйте это:

final HttpClient client = new HttpClient(); 
    client.getParams().setAuthenticationPreemptive(true); 
    client.getState().setCredentials(AuthScope.ANY, new UsernamePasswordCredentials(user.getUsername(), user.getPassword())); 
    final GetMethod method = new GetMethod(uri); 
    client.executeMethod(method); 
+1

Спасибо Киран. У меня нет метода getState на клиенте, но я думаю, что мы просто используем разные версии. Я попробовал 'AuthScope.ANY', как вы предложили, и это сработало - спасибо. Могу ли я просто задать вам еще один вопрос - это 'setAuthenticationPreemptive (true)' required/recommended? – user265330

+1

Пришло время увидеть этот комментарий. «SetAuthenticationPreemptive (true)» означает, что кривенальные функции будут отправляться в первоначальном запросе без предварительного запроса с запросом без учетных данных, а затем получения 401, а затем предоставления им после вызова. – Kieran

+2

Эти методы недоступны в HttpClient4.1 – MayurB

2

С, по крайней мере версии 4.2.3 (я предполагаю, что после версии 3.X), то принятый ответ больше недействителен. Вместо этого, сделать что-то вроде:

private HttpClient createClient() { 
    HttpParams params = new BasicHttpParams(); 
    HttpProtocolParams.setContentCharset(params, "UTF-8"); 

    Credentials credentials = new UsernamePasswordCredentials("user", "password"); 
    DefaultHttpClient httpclient = new DefaultHttpClient(params); 
    httpclient.getCredentialsProvider().setCredentials(AuthScope.ANY, credentials); 

    return httpclient; 
} 

JavaDoc для AuthScope.ANY говорит В будущих версиях HttpClient использование этого параметра будет прекращено, так что используйте его на свой страх и риск. Лучшим вариантом было бы использовать один из конструкторов, определенный в AuthScope.

Для обсуждения о том, как сделать запросы упреждающий, см:

Preemptive Basic authentication with Apache HttpClient 4