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请求

  • 相关阅读:
    angular组件开发
    APICloud案例源码、模块源码、考试源码、开发工具大集合!赶快收藏
    Vue-router实现单页面应用在没有登录情况下,自动跳转到登录页面
    原生js实现架子鼓特效
    A Beginner’s Introduction to CSS Animation中文版
    react开发教程(三)组件的构建
    体验javascript之美第五课 五分钟彻底明白 匿名函数自执行和闭包
    这些例子很炫,感兴趣的童鞋可以了解一下
    体验javascript之美6:如果你觉得什么都会了或者不知道js学什么了看这里-面向对象编程
    傅里叶变换,小波变换,EMD,HHT,VMD(经典和现代信号处理方法基本原理概念)
  • 原文地址:https://www.cnblogs.com/baby123/p/12014117.html
Copyright © 2011-2022 走看看