下面是spring集成httpclient配置的详细过程。
1. 引入依赖
首先在pom.xml中引入httpclient和httpasyncclient的依赖:
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId>
<version>4.5.9</version>
</dependency>
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpasyncclient</artifactId>
<version>4.1.4</version>
</dependency>
2. 配置HttpClient连接池
使用HttpClient连接池能够有效地提高HTTP客户端的性能和稳定性,建议在Spring项目中使用。配置连接池需要定义以下4个bean:
2.1 PoolingHttpClientConnectionManager
定义一个PoolingHttpClientConnectionManager bean,它是连接池管理器,可以指定最大连接数和每个路由的最大连接数。
<bean id="httpClientConnectionManager" class="org.apache.http.impl.conn.PoolingHttpClientConnectionManager">
<property name="maxTotal" value="100"/>
<property name="defaultMaxPerRoute" value="20" />
</bean>
2.2 RequestConfig
定义一个RequestConfig bean,它是HTTP请求的配置,可以设置socket和连接超时时间,以及其他一些请求参数,例如防火墙等。
<bean id="requestConfig" class="org.apache.http.client.config.RequestConfig" factory-method="custom">
<constructor-arg value="5000"/>
<constructor-arg value="5000"/>
<constructor-arg value="true"/>
<constructor-arg value="true"/>
</bean>
<util:constant id="TIMEOUT" static-field="org.apache.http.client.config.RequestConfig.DEFAULT"/>
<util:abstract-bean id="baseRequestConfig" parent="TIMEOUT"/>
2.3 HttpClientBuilder
定义一个HttpClientBuilder bean,它是HTTP客户端的构造器,可以在连接池管理器和请求配置的基础上创建一个HttpClient对象。
<bean id="httpClientBuilder" class="org.apache.http.impl.client.HttpClientBuilder" factory-method="create">
<property name="connectionManager" ref="httpClientConnectionManager" />
<property name="defaultRequestConfig" ref="baseRequestConfig" />
</bean>
2.4 CloseableHttpClient
定义一个CloseableHttpClient bean,它是可以直接使用的HTTP客户端。
<bean id="httpClient" class="org.apache.http.impl.client.FutureRequestExecutionService" primary="true">
<constructor-arg ref="httpClientBuilder"/>
<constructor-arg ref="httpClientConnectionManager"/>
<constructor-arg>
<bean class="org.apache.http.impl.client.HttpRequestFutureTask.CancelRequest"/>
</constructor-arg>
</bean>
3. 配置HttpClient拦截器
可以通过HttpClient拦截器实现一些常见的HTTP请求处理,例如日志记录、响应处理、重试等。
<bean id="loggingInterceptor" class="com.example.LoggingInterceptor"/>
<bean id="requestInterceptor" class="com.example.RequestInterceptor"/>
<bean id="responseInterceptor" class="com.example.ResponseInterceptor"/>
<bean id="retryInterceptor" class="com.example.RetryInterceptor"/>
4. 配置RestTemplate
最后,将HttpClient对象注入到RestTemplate中,就可以方便地使用RestTemplate发送HTTP请求了。例如:
<bean id="restTemplate" class="org.springframework.web.client.RestTemplate">
<constructor-arg>
<bean class="org.springframework.http.client.HttpComponentsClientHttpRequestFactory">
<constructor-arg ref="httpClient"/>
</bean>
</constructor-arg>
<property name="interceptors">
<list>
<ref bean="loggingInterceptor" />
<ref bean="requestInterceptor" />
<ref bean="responseInterceptor" />
<ref bean="retryInterceptor" />
</list>
</property>
</bean>
以上就是spring集成httpclient配置的详细过程。下面给出两条示例说明。
示例1:使用GET请求获取微信access_token
public String getAccessToken(String appId, String secret) {
String url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=" + appId + "&secret=" + secret;
ResponseEntity<String> responseEntity = restTemplate.getForEntity(url, String.class);
String response = responseEntity.getBody();
JSONObject jsonObject = JSON.parseObject(response);
String accessToken = jsonObject.getString("access_token");
return accessToken;
}
示例2:使用POST请求发送JSON数据
public void sendMessage(String url, JSONObject message) {
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_JSON);
HttpEntity<String> httpEntity = new HttpEntity<>(message.toJSONString(), headers);
restTemplate.postForEntity(url, httpEntity, String.class);
}
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:spring集成httpclient配置的详细过程 - Python技术站