Autenticação básica com RestTemplate (3.1)

Eu estou tentando reproduzir o seguinte comando curl usando Java:

curl -v -u user:pass http://myapp.com/api 

Este comando retorna alguns dados JSON.

Minha implementação Java com bugs é a seguinte:

 @Test public void callTest() { RestTemplate restTemplate = createRestTemplate("user", "pass"); URI uri = new URI("http://myapp.com/api"); String res = restTemplate.getForObject(uri, String.class); } private static RestTemplate createRestTemplate(String username, String password) { UsernamePasswordCredentials cred = new UsernamePasswordCredentials(username, password); BasicCredentialsProvider cp = new BasicCredentialsProvider(); cp.setCredentials(AuthScope.ANY, cred); DefaultHttpClient client = new DefaultHttpClient(); client.setCredentialsProvider(cp); ClientHttpRequestFactory factory = new HttpComponentsClientHttpRequestFactory(client); RestTemplate restTemplate = new RestTemplate(factory); // set the media types properly return restTemplate; } 

No entanto, quando eu executo o teste, ele retorna um org.springframework.web.client.HttpClientErrorException: 401 Unauthorized Exceção org.springframework.web.client.HttpClientErrorException: 401 Unauthorized .

Ao entrar em DEBUG , não vejo nenhuma informação sobre a autenticação …

O que estou fazendo errado ao definir as credenciais de autenticação?

Instanciando usando

 HttpClient client = new HttpClient(); 

não existe mais e a class DefaultHttpClient está obsoleta do HttpComponents HttpClient da versão 4.3 . Portanto, outras respostas são inválidas ou obsoletas. Aqui está a minha versão, eu escrevi esta class para pedidos de descanso que exigem autenticação básica:

 import org.apache.http.auth.AuthScope; import org.apache.http.auth.UsernamePasswordCredentials; import org.apache.http.client.CredentialsProvider; import org.apache.http.client.HttpClient; import org.apache.http.impl.client.BasicCredentialsProvider; import org.apache.http.impl.client.HttpClients; import org.springframework.http.client.HttpComponentsClientHttpRequestFactory; import org.springframework.web.client.RestTemplate; public class RestClient extends RestTemplate { public RestClient(String username, String password) { CredentialsProvider credsProvider = new BasicCredentialsProvider(); credsProvider.setCredentials( new AuthScope(null, -1), new UsernamePasswordCredentials(username, password)); HttpClient httpClient = HttpClients.custom().setDefaultCredentialsProvider(credsProvider).build(); setRequestFactory(new HttpComponentsClientHttpRequestFactory(httpClient)); } } 

Então use como, por exemplo:

 RestClient restClient = new RestClient("username", "password"); String result = restClient.postForObject(... 

Eu faço algo assim – e isso funcionou para mim:

 private RestTemplate createRestTemplate(String username, String password) { return new RestTemplate(this.createSecureTransport(username, password)); } protected ClientHttpRequestFactory createSecureTransport(String username, String password){ HttpClient client = new HttpClient(); UsernamePasswordCredentials credentials = new UsernamePasswordCredentials(username,password); client.getState().setCredentials(AuthScope.ANY, credentials); CommonsClientHttpRequestFactory commons = new CommonsClientHttpRequestFactory(client); return commons; } 

É usado aqui: Código de referência

Esta resposta é baseada na de @kevinpeterson, mas com uma reescrita para usar o Apache HTTP Client atualizado.

 RestTemplate createRestTemplate(String username, String password, String host, int port ) { return new RestTemplate(this.createSecureTransport( username, password, host, port )); } ClientHttpRequestFactory createSecureTransport( String username, String password, String host, int port ){ DefaultHttpClient client = new DefaultHttpClient(); UsernamePasswordCredentials credentials = new UsernamePasswordCredentials( username, password ); client.getCredentialsProvider().setCredentials( new AuthScope( host, port ), credentials ); return new HttpComponentsClientHttpRequestFactory(client); 

httpclient v4.0 não suporta autenticação preventiva

Veja isto: http://forum.springsource.org/showthread.php?123385-Preemptive-Basic-Authentication-with-RestTemplate

Na primavera, a fonte encontrou essa solução.

Funciona para mim.

Veja isto: RestTemplate com Basic Auth no Spring 3.1