因为项目须要调用其余微服务的数据,首先想到的就是写一个http网络请求的工具类,可是想到在以前看springCloud的时候里面有这个Fegin能够实现,就顺便实践一下,虽然过程有点坎坷,好在都顺利解决了,在实践的过程当中主要碰见了如下几个问题spring
1) 不一样请求方式传参方式不一样json
2) 同一请求方式请求头信息不一样api
3) 发送请求时候的编码器不一样网络
4) 文件上传app
(一) Fegin使用ide
1) 添加依赖微服务
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-feign</artifactId> </dependency>
2)在启动类上加上注解
工具
@EnableEurekaClient @EnableHystrixDashboard @EnableFeignClients //这个就是使用Feign须要添加的注解 @SpringBootApplication public class VideoProxyServiceApplication { public static void main(String[] args) { SpringApplication.run(VideoProxyServiceApplication.class, args); } }
3)Feign 客户端接口
测试
@Component @FeignClient(name = "stream-service",url = "${stream_service}") //name指定FeignClient的名称,url通常用于调试,能够手动指定@FeignClient调用的地址 public interface StreamServiceClient { //GET请求 @RequestMapping(value = "/task/findById",method = RequestMethod.GET) String findById(@RequestParam(value = "id") String id);
4)在Controller层里调用编码
@RestController @RequestMapping(value = "stream") public class StreamServiceController { @Autowired private StreamServiceClient streamServiceClient; @RequestMapping(value = "/findById",method = RequestMethod.GET) public ResponseResult findById(String id) { String s = streamServiceClient.findById(id); return responseResult(s, "jsonObject"); //ResponseResult是封装的一个返回对象,而responseResult是写的一个处理结果的公共方法,这里就不展现了 } 点击查看代码
到这里整个Feign的使用基本上就结束了,可是若是你认为这样你就能够顺利的使用Feign,那么恭喜你,你将会很闹心,由于在调用别人的服务的时候你不肯定人家究竟是须要怎么取请求,若是是你写接口只要你本身测试通了那就万事大吉,但是如今是别人写的接口让你调,那么你就须要考虑不少问题了,至少在我实践中遇到的有这几种,请求头须要设置、请求的时候请求参数在路径上传参该怎么传等等一系列问题
划重点,我主要就是讲的运用,也就是在实际使用过程当中对于不一样的请求,咱们应该怎么作
(二) GET请求
对于GET请求应该算是最简单的了,在这里我分两种来讲,一种参数就在请求头上,还有一种是参数在路径中的
1) 对于参数在请求头中的请求
@RequestMapping(value = "/task/findById",method = RequestMethod.GET) String findById(@RequestParam(value = "id") String id);
在@RequestMapping注解中value值是接口,method规定请求方式,在传参的时候注意必定要加上@RequestParam,值是请求的参数名
2)请求参数在路径中的请求
@RequestMapping(value = "/shrekapi/job/{id}",method = RequestMethod.GET) String deletejob(@PathVariable("id") String id);
这里注意咱们的注解是@PathVariable加上参数名
(三)POST请求
POST请求,请求的时候我遇到了三种状况,
一、请求参数在请求体中(这种方式实际上是最方便的)
// @RequestMapping(value = /addLable",method = RequestMethod.POST) String addLable(@RequestBody PointMsg lableName);//PointMsg是实体类
请求的时候直接在参数前加上@RequestBody,定义方法为POST
二、请求参数在请求头中
// @RequestMapping(value = "/updateStatusByCameraId",method = RequestMethod.POST) String updateStatusByCameraId(@RequestParam("camera") String camera);
这种请求的产生应该是在写接口的时候参数前没有加注解形成的,其实这种方式跟GET请求是如出一辙的
三、请求头映射条件不一样
//删除标签 @RequestMapping(value = "/deleteLable",method = RequestMethod.POST,headers = {"content-type=application/x-www-form-urlencoded"}) String deleteLable(@RequestParam("id") String id);
对于须要更改请求头映射的直接使用headers,定义不一样的映射
(四)文件上传、自定义编码器
因为文件上传的时候咱们咱们传参数的时候其实传的是文件,这个时候咱们默认的编码器是不支持这种的,须要咱们自定义编码器并应到咱们的client
注:在网上不少提到了自定义编码器并使用@Configuration使其生效,最好不要这样,一旦使用了这个注解那就是全局都使用这个编码器了,那么你的其余请求就会出现问题,报编码器异常
咱们的写的时候能够直接在客户端接口上指定使用哪一个编码器,而且只在这个客户端接口生效,还有注意一点的就是,@FeignClient里面的name属性不能够和其余客户端接口重复,重复的话等因而同一个客户端接口仍是会使用指定的编码器
@Component @FeignClient(name = "stream-service-File",url = "${stream_service}",configuration = FileUploadServiceClient.FeignMultipartSupportConfig.class) public interface FileUploadServiceClient { //文件上传 @RequestMapping(value = "/importFile",method = RequestMethod.POST,produces = {MediaType.APPLICATION_JSON_UTF8_VALUE}, consumes = MediaType.MULTIPART_FORM_DATA_VALUE) String upload(@RequestBody MultipartFile file); @RequestMapping(value = "/downloadExcel",method = RequestMethod.GET,consumes = MediaType.APPLICATION_JSON_UTF8_VALUE) Response downloadFile(); //自定义文件上传编码器 class FeignMultipartSupportConfig { @Bean public Encoder multipartFormEncoder() { return new SpringFormEncoder(); } @Bean public feign.Logger.Level multipartLoggerLevel() { return feign.Logger.Level.FULL; } } }
到这里结束,若是遇到了新的问题欢迎一块儿探讨,上述全部都是在使用过程当中遇到的一些问题,仅作记录,供君参考