一)替换Customer到Provider之间的连接工具为HttpClient
1.HttpURLConnection和HttpClient的区别
1)HttpClient在进行传递对象类型的时候要指定传递的参数的是JSON格式而HttpURLConnection则不需要。
2)HttpClient支持GET方式的对象传递,HttpURLConnection不支持GET方式请求参数的传递。
3)HttpClient支持池连接的Http请求,HttpURLConnection是不支持的,
二)使用HttpClient在Customer和Provider之间的请求
注意所有的操作都是的Customer中进行修饰的。
1.在文件内添加依赖包
<!--添加的HttpClient的坐标-->
<!-- https://mvnrepository.com/artifact/org.apache.httpcomponents/httpclient -->
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId>
</dependency>
<!-- 添加Feign支持的HttpClient的jar包-->
<dependency>
<groupId>com.netflix.feign</groupId>
<artifactId>feign-httpclient</artifactId>
<version>8.18.0</version>
</dependency>
2.在全局配置文件内添加的启动HttpClient连接的方式
#开启使用的HttpClient工具进行请求
feign:
httpclient:
enabled: true
3.编写测试的代码(添加服务API)
/**
* 使用HttpClient请求的时候传递对象必须要指定传递参数的格式为的JSON不然无法赋值
* @param product
* @return
*/
@PostMapping(value = "/add3",consumes = MediaType.APPLICATION_JSON_VALUE)
public Product addProduct3(@RequestBody Product product);
/**
* @param null
* @description: 使用GET方式进行对象的传递
* @return:
* @author: shinelon
* @time: 2019/9/3:9:40
*/
@GetMapping(value = "/add4")
public Product addProduct4(@RequestBody Product product);
4.Provider实现方法
@Override
public Product addProduct3(@RequestBody Product product)
{
return product;
}
/**
* @param null
* @description:注意请求一定要加上RequestBody注解不然值为null
* @return:
* @author: shinelon
* @time: 2019/9/3:9:41
*/
@Override
public Product addProduct4(@RequestBody Product product)
{
return product;
}
5.Customer消费Provider服务
/**
* @param null
* @description:POST对象请求
* @return:
* @author: shinelon
* @time: 2019/9/3:9:48
*/
@GetMapping(value = "/add3")
public Product addProduct3(Product product){
return this.productCustomerService.addProduct3(product);
}
/**
* @param null
* @description:GET对象请求
* @return:
* @author: shinelon
* @time: 2019/9/3:9:48
*/
@GetMapping(value = "/add4")
public Product addProduct4(Product product){
return this.productCustomerService.addProduct4(product);
}
6.测试
遇到的异常,因为的查看源码得知,openfeign在接受返回值时调用的不是httpclient的feign-core包的代码而是调用的本身的feign-core的代码,而本身的feign-core包中的Response类没有create方法。
得知原因后我将httpclient的依赖在pom文件中的位置上移,使openfeign优先调用httpclient的feign-core包的代码,结果在启动项目时就请求响应回来的,报错信息为:
解决方法将feign-HttpClient更换为如下依赖
<dependency>
<groupId>io.github.openfeign</groupId>
<artifactId>feign-httpclient</artifactId>
<version>10.1.0</version>
</dependency>
异常消除正常返回结果
POST请求传递对象参数
GET请求传递对象参数