Feign消费服务时POST/GET请求方式

本文详细介绍了在Spring Cloud Dalston.RC1和Spring Boot 1.5.2.RELEASE环境下,使用Feign进行GET和POST请求的具体条件。包括无参、单参和多参情况下如何配置请求方式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

声明本结论基于Spring Cloud Dalston.RC1Spring Boot1.5.2.RELEASE


总体说明

feign消费服务时,以GET方式请求的条件

如果想让服务消费者采用GET方式调用服务提供者,那么需要:

  1. 服务消费者这边feign调用时,在所有参数前加上@RequestParam注解
  2. 服务消费者这边feign调用时,指明为GET方式(注:如果不指明method,那么在条件1满足的情况下,采用的是默认的GET方式)。

注:这里条件1和条件2,是“且”的关系(都满足时,才为GET)

feign消费服务时,以POST方式请求的条件

如果想让服务消费者采用POST方式调用服务提供者,那么只需要:

  1. 服务消费者这边feign调用时,在所有参数前加上@RequestParam注解,并指明feign消费服务的方式为POST
  2. 服务消费者这边feign调用时,有且只有一个参数前为@RequestBody或什么也没有(如果有多个参数,那么其余参数前必须有@RequestParam)。

注:这里条件1和条件2,是“或”的关系(当至少一个满足时,即为POST)

注:在服务消费者中,使用feign消费服务时,如果参数前什么也不写,那么默认是由@RequestBody指明的

即:只要不满足GET方式请求,那么POST方式请求是一定支持的


下面进行详细说明

无参

服务消费者以GET方式请求消费服务的情况(示例):

不指定method,则默认为get,等同于

服务消费者以POST方式请求消费服务的情况(示例):

单参

服务消费者以GET方式请求消费服务的情况(示例):

参数前使用了@RequestParam,且指明了用GET方式

等同于(当所有参数前都有@RequestParam时,这时不指明method,则默认为采用GET方式):

服务消费者以POST方式请求消费服务的情况(示例):

  • 参数前使用了@RequestParam,且指明了用POST方式

  • 参数前未使用@RequestParam或参数前使用了@RequestBody注解(此时不论是否手动指定请求方式、不论指定的方式是POST还是GET,那么最终都以POST方式消费服务)

注:在服务消费者中,使用feign消费服务时,如果参数前什么也不写,那么默认是由@RequestBody指明的

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

注:在服务提供者的Controller中,

  • 如果要接收(服务消费中传过来的)被@RequestBody指明的参数,那么对应方法的对应参数前一定要有@RequestBody;(如果没有的话,收到的参数值就为null;如果写成@RequestParam的话,那么feign调用会失败)
  • 如果要接收(服务消费中传过来的)被@RequestParam指明的参数,那么可以写@RequestParam,也可以不写(当服务提供者中对应的参数名字与服务消费者传过来的参数名字一致时,可以不写,不一致时,需要写)

多参

服务消费者以GET方式请求消费服务的情况(示例):

如果想让服务消费者采用GET方式调用服务提供者,那么需要:

  1. 服务消费者这边feign调用时,在所有参数前加上@RequestParam注解
  2. 服务消费者这边feign调用时,指明为GET方式(注:如果不指明method,那么在条件1满足的情况下,默认采用的也是GET方式)。

等同于

服务消费者以POST方式请求消费服务的情况(示例):

       多参数时,如果服务消费者想采用POST进行feign调用,那么:服务消费者中该接口方法里的这些参数前,最多只能有一个参数是@RequestBody指明的,其余的参数必须使用@RequestParam指明。

如:

等同于(String name 这个参数前什么也不写,那么默认的即为@RequestBody)

如果服务消费者这边feign调用时,所有参数前面都使用了@RequestParam注解时,但是指明的是POST方式,那么最终还是以POST方式进行的:

服务提供者接收时

  • 如果服务消费者传过来参数时,全都用的是@RequestParam的话,那么服务提供者的Controller中对应参数前可以写@RequestParam,也可以不写(当两边参数名字一致时,可以省略不写)
  • 如果服务消费者传过来参数时,有@RequestBody的话,那么服务提供者的Controller中对应参数前必须要写@RequestBody(如果是多参数的话,其余参数前视情况可以写@RequestParam,也可以不写)

       注意:如果接口与接口的实现分别处于两个服务中,那么接口就相当于服务消费者,而接口的实现则相当于服务提供者。两者之间仍然满足本文上所述要求。如:

服务消费者中的接口是这样的:

那么对应的服务提供者中的Controller应该是这样的:

 

^_^ 如有不当之处,欢迎指正

^_^ 本文已经被收录进《程序员成长笔记(二)》,作者JustryDeng

### Feign GET 请求发送对象参数 当使用 Feign 客户端发送 GET 请求并传递对象作为参数,由于 HTTP 协议本身的限制,GET 请求通常不允许在请求体中携带数据。因此,在这种情况下,需要将对象中的各个字段转换成 URL 查询参数来实现。 对于 Feign Client 来说,如果要发送的对象包含多个属性,则可以通过定义接口的方法签名,并利用 `@RequestParam` 注解指定如何映射这些属性到查询字符串上[^1]。需要注意的是,Feign 不支持直接将整个 Java 对象序列化为 JSON 并放在 GET 请求体内传输;相反,应该手动构建查询参数或者借助库函数自动完成此过程。 下面是一个简单的例子展示如何配置 Feign Client 以发送带有复杂对象的 GET 请求: ```java // 假设有一个名为 QueryParamObject 的类表示我们要传递的对象结构 public class QueryParamObject { private String param1; private Integer param2; // Getters and setters... } // 接口声明部分 @FeignClient(name = "exampleService", url = "${service.url}") public interface ExampleClient { @GetMapping("/api/resource") ResponseEntity<String> getResource(@ModelAttribute QueryParamObject query); } ``` 在这个例子中,`@ModelAttribute` 可用于指示 Spring MVC 将请求参数绑定到命令对象或表单对象上。不过请注意,这可能不是最标准的做法,因为严格意义上讲这是针对 HTML 表单提交设计的功能。更推荐的方式是显式地标记每一个参数: ```java @GetMapping("/api/resource") ResponseEntity<String> getResource( @RequestParam(value="param1") String param1, @RequestParam(value="param2") Integer param2); ``` 另外值得注意的一点是在某些版本的 Feign 中确实存在一种行为模式,即无论是什么样的 HTTP 方法(包括 GET),只要检测到了对象类型的参数就会尝试将其视为 POST 请求处理[^2]。但这并不是官方文档所提倡的最佳实践,而且可能会带来兼容性和安全性方面的问题。所以建议按照上述方法正确设置 GET 请求及其参数。
评论 35
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值