------------------------------------httpclient ------------------------
1.引入jar包
<!--httpclient-->
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId>
<version>4.5.1</version>
</dependency>
2.设置spring 对于httpclient 的相关启动参数
httpclient.properties 文件内容如下
#设置连接总数
http.maxTotal=500
#设置每个主机最大的并发数
http.defaultMaxPerRoute=100
#设置创建连接的最长时间
http.connectTimeout=2000
#从连接池中获取到连接的最长时间
http.connectionRequestTimeout=500
#数据传输的最长时间
http.socketTimeout=6000
#空闲时间(用于定期清理空闲连接)
http.maxIdleTime = 1
3.导入配置文件
/**
* @Author 郑*冲
* HttpClient的配置类---类似工具类
* Configuration:标明这是一个配置类
* ConfigurationProperties:加载application.properties属性文件
* prefix:前缀
* ignoreUnknownFields:忽略找不到的属性
* 自动将属性文件中的值赋值该类中的属性
*
* 最终需要知道:
* 1 SpringBoot推荐使用RestTemplate操作RestFul API
* 2 RestTemplate底层需要借助HttpClient创建
*
*
*/
@Configuration
public class HttpClientConfig {
@Value("${http.maxTotal}")
private Integer maxTotal;// 最大连接
@Value("${http.defaultMaxPerRoute}")
private Integer defaultMaxPerRoute;// 每个host的最大连接
@Value("${http.connectTimeout}")
private Integer connectTimeout;// 连接超时时间
@Value("${http.connectionRequestTimeout}")
private Integer connectionRequestTimeout;// 请求超时时间
@Value("${http.socketTimeout}")
private Integer socketTimeout;// 响应超时时间
/**
* HttpClient连接池
*/
@Bean
public HttpClientConnectionManager httpClientConnectionManager() {
PoolingHttpClientConnectionManager connectionManager = new PoolingHttpClientConnectionManager();
connectionManager.setMaxTotal(maxTotal);
connectionManager.setDefaultMaxPerRoute(defaultMaxPerRoute);
return connectionManager;
}
/**
* 注册RequestConfig
*/
@Bean
public RequestConfig requestConfig() {
return RequestConfig.custom().setConnectTimeout(connectTimeout)
.setConnectionRequestTimeout(connectionRequestTimeout).setSocketTimeout(socketTimeout)
.build();
}
/**
* 注册HttpClient
*/
@Bean
public HttpClient httpClient(HttpClientConnectionManager manager, RequestConfig config) {
return HttpClientBuilder.create().setConnectionManager(manager).setDefaultRequestConfig(config)
.build();
}
/**
* 使用连接池管理连接
*/
@Bean
public ClientHttpRequestFactory requestFactory(HttpClient httpClient) {
return new HttpComponentsClientHttpRequestFactory(httpClient);
}
/**
* 使用HttpClient来初始化一个RestTemplate
*/
@Bean
public RestTemplate restTemplate(ClientHttpRequestFactory requestFactory) {
RestTemplate template = new RestTemplate(requestFactory);
List<HttpMessageConverter<?>> list = template.getMessageConverters();
for (HttpMessageConverter<?> mc : list) {
if (mc instanceof StringHttpMessageConverter) {
((StringHttpMessageConverter) mc).setDefaultCharset(Charset.forName("UTF-8"));
}
}
return template;
}
public Integer getMaxTotal() {
return maxTotal;
}
public void setMaxTotal(Integer maxTotal) {
this.maxTotal = maxTotal;
}
public Integer getDefaultMaxPerRoute() {
return defaultMaxPerRoute;
}
public void setDefaultMaxPerRoute(Integer defaultMaxPerRoute) {
this.defaultMaxPerRoute = defaultMaxPerRoute;
}
public Integer getConnectTimeout() {
return connectTimeout;
}
public void setConnectTimeout(Integer connectTimeout) {
this.connectTimeout = connectTimeout;
}
public Integer getConnectionRequestTimeout() {
return connectionRequestTimeout;
}
public void setConnectionRequestTimeout(Integer connectionRequestTimeout) {
this.connectionRequestTimeout = connectionRequestTimeout;
}
public Integer getSocketTimeout() {
return socketTimeout;
}
public void setSocketTimeout(Integer socketTimeout) {
this.socketTimeout = socketTimeout;
}
}
4.SpringBoot 要在httpclient 配置类中修改一下 指定配置文件的路径
@ConfigurationPropertie注解它会自己去找需要的属性 不需要 @Value 指定
@PropertySource(value = {"classpath:httpclient.properties"})
@Configuration
@ConfigurationProperties(prefix = "http", ignoreUnknownFields = true)
public class HttpClientConfig {
private Integer maxTotal;// 最大连接
private Integer defaultMaxPerRoute;// 每个host的最大连接
private Integer connectTimeout;// 连接超时时间
private Integer connectionRequestTimeout;// 请求超时时间
private Integer socketTimeout;// 响应超时时间
5. 在你的Controller 类里 注入 RestTemplate
/** httpclient **/
@Resource
private RestTemplate restTemplate;
6.请求方式
---------------------------发送get请求
ResponseEntity<Map> en = restTemplate.getForEntity(url, Map.class);
---------------------------发送post 请求
传某个实体对象作为例子
public class PlatformCreateMember {
private List<TerminalMember> terminalMemberList;
private String callerTerminalMemberNo;//调用者的编号
private String callerTerminalMemberType;//调用者的名称
。。。。。。省略了相关的get 和 set 方法 idea的话快捷键Alt+Insert 选择 Getter and Setter 生成
在注入RestTemplate 的Controller 方法中调用
/**
* @ClassName UserController
* @Description 用户
* @Author 郑*冲
* @Date 2019/6/18 14:47
**/
@RestController
@RequestMapping("/user")
public class UserController {
@Resource
private RestTemplate restTemplate;
@Autowired
private UserService userService;
@GetMapping("/find")
public ResponseEntity<Object> find(){
PlatformCreateMember platformCreateMember=new PlatformCreateMember ();
MultiValueMap<String, String> paramMap = new LinkedMultiValueMap<String, String>();
paramMap.add("platformCreateMember", JSONObject.toJSONString(platformCreateMember));
ResponseEntity<Map> en = restTemplate.postForEntity(url, paramMap, String.class);
return new ResponseEntity<>(en.getBody(),HttpStatus.OK);
}
}
----
获取返回数据
en.getBody();