zoukankan      html  css  js  c++  java
  • SpringCloud 之 Fegin —— 发送GET、POST请求以及文件上传

        由于项目需要调用其他微服务的数据,首先想到的就是写一个http网络请求的工具类,但是想到在之前看springCloud的时候里面有这个Fegin可以实现,就顺便实践一下,虽然过程有点坎坷,好在都顺利解决了,在实践的过程中主要遇见了以下几个问题

        1) 不同请求方式传参方式不同

        2) 同一请求方式请求头信息不同

        3) 发送请求时候的编码器不同

        4) 文件上传

     

     

     

    (一) Fegin使用

            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请求,请求的时候我遇到了三种情况,

               1、请求参数在请求体中(这种方式其实是最方便的)

    //
    @RequestMapping(value = /addLable",method = RequestMethod.POST)
    String addLable(@RequestBody PointMsg lableName);//PointMsg是实体类
    
    

                         请求的时候直接在参数前加上@RequestBody,定义方法为POST

               2、请求参数在请求头中

        //
        @RequestMapping(value = "/updateStatusByCameraId",method = RequestMethod.POST)
        String updateStatusByCameraId(@RequestParam("camera") String camera);
    

                      这种请求的产生应该是在写接口的时候参数前没有加注解造成的,其实这种方式跟GET请求是一模一样的

               3、请求头映射条件不同

             

        //删除标签
        @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;
            }
        }
    
    
    }

     

     

    到这里结束,如果遇到了新的问题欢迎一起探讨,上述所有都是在使用过程中遇到的一些问题,仅做记录,供君参考

  • 相关阅读:
    nodejs安装autoprefixer
    nodejs安装Yui Compressor
    js捕捉回车事件
    支付宝服务窗前台页面规范
    html5 input type number 去掉加减号
    [USACO10HOL]赶小猪题解
    [USACO09FEB]改造路题解
    [HNOI2013]游走题解
    洛谷P1649 [USACO07OCT]障碍路线Obstacle Course BFS 最小转弯
    洛谷P1467 循环数 Runaround Numbers
  • 原文地址:https://www.cnblogs.com/SunArmy/p/9985515.html
Copyright © 2011-2022 走看看