zoukankan      html  css  js  c++  java
  • SpringCloud Feign 参数问题

    今天遇到使用Feign调用微服务,传递参数时遇到几个问题

    1.无参数

    以GET方式请求

    服务提供者

    @RequestMapping("/hello")
    public String Hello(){
        return "hello,provider";
    }

    服务消费者

    @GetMapping("/hello")
    String hello();

    2.单个参数

    (1)GET——@PathVariable

    服务提供者

    @GetMapping("/test/{name}")
    public String test(@PathVariable String name){
        return "hello,"+name;
    }

    服务消费者

    @GetMapping("/test/{name}")
    String test(@PathVariable("name") String name);

    (2)GET——@RequestParam

    服务提供者

    @RequestMapping("/test")
    public String test(String name){return "hello,"+name;
    }

    服务消费者

    @RequestMapping("/test")
    String test(@RequestParam String name);

    会遇到报错

    RequestParam.value() was empty on parameter 0

    解决方法:

      加上注解的描述,修改为

    @RequestMapping("/test")
    String test(@RequestParam("name") String name);

    (3)POST

    @RequestBody

    不需要注解的描述

    @RequestMapping("/test")
    String test(@RequestBody String name);

    注:

      参数前使用了@RequestBody注解的,都以POST方式消费服务

      @RequestBody注解的参数,需要POST方式才能传递数据

    2.Feign多参数的问题

    (1)GET——@PathVariable

    服务提供者

    @GetMapping("/test/{name}/{xyz}")
    public String test(@PathVariable String name,@PathVariable String xyz){
            return "hello,"+name+","+xyz;
    }

    服务消费者

    @GetMapping("/test/{name}/{xyz}")
    String test(@PathVariable("name") String name,@PathVariable("xyz") String xyz);

    (1)GET——@RequestParam

    服务提供者

    @RequestMapping("/test")
    public String test(String name,Integer type){
       if(type==1){
            return "hello,"+name;
       }else{
            return "hello,provider-"+name;
       }
    }

    服务消费者

    @RequestMapping("/test")
    String test(String name,  Integer type);

    会遇到报错Method has too many Body parameters

    说明:

      如果服务消费者传过来参数时,全都用的是@RequestParam的话,那么服务提供者的Controller中对应参数前可以写@RequestParam,也可以不写

      服务消费者feign调用时,在所有参数前加上@RequestParam注解

    正确的写法

    @RequestMapping("/test")
    String test(@RequestParam("name") String name, @RequestParam("type") Integer type);

    (2)POST

    如果接收方不变

    服务消费者

    @RequestMapping("/test")
    String test(@RequestBody String name, @RequestBody Integer type);

    会遇到报错Method has too many Body parameters

    服务消费者为

    @RequestMapping("/test")
    String test(@RequestBody String name, @RequestParam("type") Integer type);

    name的值会为null

    说明:

      如果服务消费者传过来参数,有@RequestBody的话,那么服务提供者的Controller中对应参数前必须要写@RequestBody

    正确的写法

    服务提供者

    @RequestMapping("/test")
        public String test(@RequestBody String name, Integer type){
            if(type==1){
                return "hello,"+name;
            }else{
                return "hello,provider-"+name;
            }
        }

    服务消费者正确的写法

    @RequestMapping("/test")
        String test(@RequestBody String name, @RequestParam("type") Integer type);

    可以接收到参数

    总结:

      请求参数前加上注解@PathVariable、@RequestParam或@RequestBody修饰

      可以有多个@RequestParam,但只能有不超过一个@RequestBody

      使用@RequestParam注解时必须要在后面加上参数名

      @RequestBody用来修饰对象,但是既有@RequestBody也有@RequestParam,那么参数就要放在请求的url中,@RequestBody修饰的就要放在提交对象中

      当参数比较复杂时,feign即使声明为get请求也会强行使用post请求

  • 相关阅读:
    关于使用表格制作页面
    0728关于html的几个基础知识点
    实验四 主存空间的分配和回收模拟
    实验三同学评论http://home.cnblogs.com/u/MyDring/
    实验三 进程调度模拟程序
    实验二报告
    实验一报告
    0909操作系统
    log4j的配置文件的编写
    随机产生数,字母
  • 原文地址:https://www.cnblogs.com/baby123/p/12014117.html
Copyright © 2011-2022 走看看