专栏首页A周立SpringCloud如何使用Feign构造多参数的请求

如何使用Feign构造多参数的请求

最近经常有人在Spring Cloud中国社区(http://springcloud.cn)QQ群(157525002)里问到该问题。索性整理一下。

本节我们来探讨如何使用Feign构造多参数的请求。笔者以GET以及POST方法的请求为例进行讲解,其他方法(例如DELETE、PUT等)的请求原理相通,大家可自行研究。

GET请求多参数的URL

假设我们请求的URL包含多个参数,例如http://microservice-provider-user/get?id=1&username=张三 ,要如何构造呢?

我们知道,Spring Cloud为Feign添加了Spring MVC的注解支持,那么我们不妨按照Spring MVC的写法尝试一下:

 @FeignClient("microservice-provider-user")public interface UserFeignClient {  @RequestMapping(value = "/get", method = RequestMethod.GET)  public User get0(User user);}

然而,这种写法并不正确,控制台会输出类似如下的异常。

 feign.FeignException: status 405 reading UserFeignClient#get0(User); content:{"timestamp":1482676142940,"status":405,"error":"Method Not Allowed","exception":"org.springframework.web.HttpRequestMethodNotSupportedException","message":"Request method 'POST' not supported","path":"/get"}

由异常可知,尽管我们指定了GET方法,Feign依然会使用POST方法发送请求。

正确写法如下:

(1) 方法一

 @FeignClient(name = "microservice-provider-user")public interface UserFeignClient {  @RequestMapping(value = "/get", method = RequestMethod.GET)  public User get1(@RequestParam("id") Long id, @RequestParam("username") String username);}

这是最为直观的方式,URL有几个参数,Feign接口中的方法就有几个参数。使用@RequestParam注解指定请求的参数是什么。

(2) 方法二

多参数的URL也可使用Map来构建。当目标URL参数非常多的时候,可使用这种方式简化Feign接口的编写。

 @FeignClient(name = "microservice-provider-user")public interface UserFeignClient {  @RequestMapping(value = "/get", method = RequestMethod.GET)  public User get2(@RequestParam Map<String, Object> map);}

在调用时,可使用类似以下的代码。

 public User get(String username, String password) {  HashMap<String, Object> map = Maps.newHashMap();  map.put("id", "1");  map.put("username", "张三");  return this.userFeignClient.get2(map);}

POST请求包含多个参数

下面我们来讨论如何使用Feign构造包含多个参数的POST请求。假设服务提供者的Controller是这样编写的:

 @RestControllerpublic class UserController {  @PostMapping("/post")  public User post(@RequestBody User user) {    ...  }}

我们要如何使用Feign去请求呢?答案非常简单,示例:

 @FeignClient(name = "microservice-provider-user")public interface UserFeignClient {  @RequestMapping(value = "/post", method = RequestMethod.POST)  public User post(@RequestBody User user);}

TIPS

(1) 本节相关代码,详见本书配套代码中的microservice-provider-user-multiple-params项目和microservice-consumer-movie-feign-multiple-params项目。

(2) 除本节讲解的方式外,我们也可编写自己的编码器来构造多参数的请求,但这种方式编码成本较高,代码可重用性较低。故此,本书不再赘述。

拓展阅读

(1) 希望Feign能够支持参数请求使用POJO的Issue:https://github.com/spring-cloud/spring-cloud-netflix/issues/1253(2) 建议使用Feign原生的注解的Issue:https://github.com/spring-cloud/spring-cloud-netflix/issues/659(3) 建议增强Feign的功能:https://github.com/spring-cloud/spring-cloud-netflix/issues/1360(4) 建议支持可选的Request Body(目前Feign当POST一个null时,会报异常):https://github.com/spring-cloud/spring-cloud-netflix/issues/1047

本文分享自微信公众号 - A周立SpringCloud(gh_e6849e368b5f),作者:周立

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2017-01-15

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Spring Cloud Gateway-路由谓词工厂详解(Route Predicate Factories)

    这一节来详细探讨Spring Cloud Gateway的路由谓词工厂(Route Predicate Factories),路由谓词工厂的作用是:符合Pred...

    用户1516716
  • 非常有必要了解的Springboot启动扩展点

    Spring的核心思想就是容器,当容器refresh的时候,外部看上去风平浪静,其实内部则是一片惊涛骇浪,汪洋一片。Springboot更是封装了Spring,...

    用户1516716
  • 跟我学Spring Cloud(Finchley版)-17-Zuul路由配置详解

    默认的路由规则是:访问 $ZUUL_URL/指定为服务/** 会被转发到 指定微服务 的 /** 。

    用户1516716
  • SpringBoot mybatis方式实现增删改查

    WeChat8ac39b77d612cd05cf4a0c1775552328.png

    赵哥窟
  • mybatis-plus的使用 ------ 进阶

    关于mybatis-plus的简介以及基本使用,我在《mybatis-plus的使用 ------ 入门》一文中已做介绍,此处不再赘述。本文主要对mybatis...

    贪挽懒月
  • Entity Framework——常见报错总结

    1 实体属性配置为IsRequired()对更新的影响 抛出异常类型DbEntityValidationException 表结构: ? 实体: public ...

    甜橙很酸
  • Python中的ORM工具:Peewee

    上一篇文章介绍了Pyhton中的ORM工具:SQLAlchemy。本文延续之前的风格,介绍另一个ORM模块:Peewee,希望通过简单的CRUD示例可以帮助大家...

    happyJared
  • JDK8新特性之Stream流

    是什么是Stream流 java.util.stream.Stream Stream流和传统的IO流,它们都叫流,却是两个完全不一样的概念和东西。 流可以简单的...

    Java技术栈
  • 基于 Go 语言开发在线论坛(二):通过模型类与MySQL数据库交互

    在这篇教程中,我们将在 MySQL 中创建一个 chitchat 数据库作为论坛项目的数据库,然后在 Go 项目中编写模型类与之进行交互。你可以本地安装 MyS...

    学院君
  • CSS禁止网页中文本被选中

    现在可以直接使用CSS3禁止网页中文本被选中了,但只兼容Firefox/Chrome/Safari,IE10了,不过也是未来主流了,下面来看看。

    周俊辉

扫码关注云+社区

领取腾讯云代金券