11

我們在Spring 3.0中使用帶xml配置的RestTemplate,它工作得很好。在Spring 3.1中使用基本身份驗證的RestTemplate

<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> 

但是,當我們試圖遷移到春天3.1版本CommonsClientHttpRequestFactory類已被棄用,也Commons的HttpClient不再使用。

我試圖設置類似的配置使用HttpComponentsClientHttpRequestFactory類和Apache HttpClient,但沒有得到如何設置Credential Provider。

我們希望httpclient具有基本身份驗證。有沒有人做過這個或任何指針會有很大的幫助。提前致謝。

回答

18

我終於可以得到這個工作。不確定它是否是最佳的,因爲這是我的第一個解決方案。

`

<!-- 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已被棄用。 – 2014-08-05 10:51:13

+0

如何使用org.apache.http 4.1.1對此配置執行搶先認證? – coldy 2017-02-03 04:58:51

0

我能夠與Spring 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> 
相關問題