11

Stavamo usando RestTemplate con la configurazione xml in Spring 3.0 e funzionava perfettamente.RestTemplate con Basic Auth in primavera 3.1

<bean id="httpClient" class="org.apache.commons.httpclient.HttpClient"> 
    <!-- <constructor-arg ref="httpClientParams"/> --> 
</bean> 

<bean id="httpClientFactory" class="org.springframework.http.client.CommonsClientHttpRequestFactory"> 
    <constructor-arg ref="httpClient"/> 
</bean> 

    <bean id="restTemplate" name="restTemplate" class="org.springframework.web.client.RestTemplate" autowire-candidate="true"> 
     <constructor-arg ref="httpClientFactory" /> 

    <property name="messageConverters"> 
     <list> 
      <bean class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter"> 
      </bean> 
      <bean class="org.springframework.http.converter.FormHttpMessageConverter"/> 
      <bean class="org.springframework.http.converter.StringHttpMessageConverter" /> 
     </list> 
    </property> 
    </bean> 

Ma, quando stiamo cercando di migrare alla primavera versione 3.1 classe CommonsClientHttpRequestFactory è deprecato e anche comuni HttpClient non è più utilizzato.

Stavo cercando di configurare una configurazione simile usando la classe HttpComponentsClientHttpRequestFactory e Apache HttpClient, ma non ottenendo come posso impostare il Provider di credenziali.

Vogliamo il httpclient con l'autenticazione di base. Qualcuno ha fatto questo o qualsiasi suggerimento sarebbe di grande aiuto. Grazie in anticipo.

risposta

18

Sono riuscito finalmente a farlo funzionare. Non sono sicuro se sia ottimale, in quanto questa è la prima soluzione che ha funzionato per me.

`

<!-- Credentials provider needed by apache default http client --> 
<bean id="credentialProvider" class="org.apache.http.impl.client.BasicCredentialsProvider" /> 

<!-- Used to invoke a method in BasicCredentialsProvider. This has to be done this way as BasicCredentialsProvider does not take 
provider and credentials in constructor or setter method. It has to set by invoking setCredentials() method and passing two arguments --> 
<bean id="methodInvoke" class="org.springframework.beans.factory.config.MethodInvokingFactoryBean"> 
    <property name="targetObject"><ref local="credentialProvider" /> </property> 
    <property name="targetMethod" value="setCredentials"> </property> 
    <property name="arguments" > 
     <list> 
      <ref local="authScope" /> 
      <ref local="credentials" /> 
     </list> 
    </property> 
</bean> 

<!-- Authorization scope for accessing restful service. Since we want this template to be used for everything, we are setting up it with defaults --> 
<bean id="authScope" class="org.apache.http.auth.AuthScope"> 
    <constructor-arg name="host"><null /></constructor-arg> 
    <constructor-arg><value>-1</value> </constructor-arg> 
    <constructor-arg><null /></constructor-arg> 
    <constructor-arg><null /></constructor-arg> 
</bean> 

<!-- Username and Password Credentials to access restful service --> 
<bean id="credentials" class="org.apache.http.auth.UsernamePasswordCredentials"> 
    <constructor-arg name="userName"><value>xxx</value></constructor-arg> 
    <constructor-arg name="password"><value>xxx</value></constructor-arg> 
</bean> 

<!-- Client factory which uses Apache HttpClient implementation. Note that it DO NOT use apache commons httpclient --> 
<bean id="httpClientFactory" class="org.springframework.http.client.HttpComponentsClientHttpRequestFactory"> 
    <constructor-arg ref="httpClient"/> 
</bean> 

<bean id="httpClient" class="org.apache.http.impl.client.DefaultHttpClient"> 
    <property name="credentialsProvider" ref="credentialProvider"/> 
</bean> 

<!-- Rest template for Spring 3.1. Used HttpClientFactory to make request --> 
    <bean id="restTemplate" name="restTemplate" class="org.springframework.web.client.RestTemplate" autowire-candidate="true"> 
     <constructor-arg ref="httpClientFactory" /> 

    <property name="messageConverters"> 
     <list> 
      <bean class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter"> 
      </bean> 
      <bean class="org.springframework.http.converter.FormHttpMessageConverter"/> 
      <bean class="org.springframework.http.converter.StringHttpMessageConverter" /> 
     </list> 
    </property> 
    </bean>` 
+0

org.apache.http.impl.client.DefaultHttpClient è deprecato. –

+0

Come eseguire un'autenticazione preventiva con questa configurazione utilizzando org.apache.http 4.1.1? – coldy

0

io sono in grado di lavorare questo fuori con la Primavera 4 RestTemplate

<bean id="restTemplate" class="org.springframework.web.client.RestTemplate"> 
     <constructor-arg ref="httpClientFactory" /> 
    </bean> 

    <bean id="httpClientFactory" class="org.springframework.http.client.HttpComponentsClientHttpRequestFactory"> 
     <constructor-arg ref="httpClient" /> 
    </bean> 

    <bean id="httpClient" factory-bean="httpClientBuilder" factory-method="build" /> 

    <bean id="httpClientBuilder" class="org.apache.http.impl.client.HttpClientBuilder" factory-method="create"> 
     <property name="defaultRequestConfig" ref="requestConfig" /> 
     <property name="defaultCredentialsProvider" ref="credentialProvider"/> 
    </bean> 

    <bean id="requestConfig" factory-bean="requestConfigBuilder" factory-method="build" /> 

    <bean id="requestConfigBuilder" class="org.apache.http.client.config.RequestConfig" factory-method="custom"> 
     <property name="socketTimeout" value="${MILLISEC`enter code here`ONDS}" /> 
     <property name="connectTimeout" value="${MILLISECONDS}" /> 
    </bean> 

<bean id="credentials" class="org.apache.http.auth.NTCredentials"> 
     <constructor-arg value="${USER}" /> 
     <constructor-arg value="${PASSWORD}" /> 
     <constructor-arg value="" /> 
     <constructor-arg value="${DOMAIN}" /> 
    </bean> 

    <bean id="credentialProvider" class="org.apache.http.impl.client.BasicCredentialsProvider" /> 

    <!-- This is used to invoke a method in BasicCredentialsProvider. This has to be done this way as BasicCredentialsProvider does not take 
    provider and credentials in constructor or setter method. It has to set by invoking setCredentials() method and passing two arguments --> 
    <bean id="methodInvoke" class="org.springframework.beans.factory.config.MethodInvokingFactoryBean"> 
     <property name="targetObject" ref="credentialProvider" /> 
     <property name="targetMethod" value="setCredentials" /> 
     <property name="arguments" > 
      <list> 
       <ref bean="authScope" /> 
       <ref bean="credentials" /> 
      </list> 
     </property> 
    </bean> 

    <!-- Authorization scope for accessing restful service. Since we want this template to be used for everything, we are setting up it with defaults --> 
    <bean id="authScope" class="org.apache.http.auth.AuthScope"> 
     <constructor-arg name="host"><null /></constructor-arg> 
     <constructor-arg><value>-1</value> </constructor-arg> 
     <constructor-arg><null /></constructor-arg> 
     <constructor-arg><null /></constructor-arg> 
    </bean> 
Problemi correlati