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

 更新时间:2018年03月28日 10:51:38   作者:周立  
这篇文章主要介绍了Spring Cloud如何使用Feign构造多参数的请求,以GET以及POST方法的请求为例进行讲解,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

本节我们来探讨如何使用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是这样编写的:

@RestController
public 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

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

相关文章

  • Springboot vue导出功能实现代码

    Springboot vue导出功能实现代码

    这篇文章主要介绍了Springboot vue导出功能实现代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-04-04
  • Java工具类实现高效编写报表

    Java工具类实现高效编写报表

    对于报表数据大部分情况下使用写sql的方式为大屏/报表提供数据来源,但是对于某些复杂情况下仅仅使用sql无法实现,这篇文章主要介绍了Java工具类实现高效编写报表
    2022-11-11
  • Springboot安全框架整合SpringSecurity实现方式

    Springboot安全框架整合SpringSecurity实现方式

    这篇文章主要介绍了Spring全家桶中Springboot安全框架整合SpringSecurity的实现方式,有需要的朋友可以借鉴参考下,希望可以有所帮助
    2021-09-09
  • springmvc不进入Controller导致404的问题

    springmvc不进入Controller导致404的问题

    这篇文章主要介绍了springmvc不进入Controller导致404的问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-02-02
  • Java设计模式中的适配器模式详解

    Java设计模式中的适配器模式详解

    适配器模式(Adapter),是Java23种设计模式中的结构型模式之一,它可以将新的功能和原先的功能连接起来,使由于需求变动导致不能用的功能,重新利用起来,本文将详细聊一聊Java适配器的运用场景和使用方法,感兴趣的同学可以跟着小编一起来学习
    2023-05-05
  • java实现文件上传下载功能

    java实现文件上传下载功能

    这篇文章主要介绍了java实现文件上传下载功能,上传单个或多个文件,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-08-08
  • Maven中的SnapShot版本和正式版本的区别

    Maven中的SnapShot版本和正式版本的区别

    在Nexus仓库中,一个仓库一般分为public(Release)仓和SNAPSHOT仓,本文详细的介绍了SnapShot版本和正式版本的区别,感兴趣的可以了解一下
    2021-06-06
  • Java利用正则表达式提取数据的方法

    Java利用正则表达式提取数据的方法

    最近由于项目需求需要提取txt里的数据,之前用C#实现过,由于最近学习了java,所以尝试用java实现下,这篇文章主要介绍了Java利用正则表达式提取数据的方法,需要的朋友可以参考下,下面来一起看看吧。
    2016-12-12
  • Java使用PreparedStatement接口及ResultSet结果集的方法示例

    Java使用PreparedStatement接口及ResultSet结果集的方法示例

    这篇文章主要介绍了Java使用PreparedStatement接口及ResultSet结果集的方法,结合实例形式分析了PreparedStatement接口及ResultSet结果集的相关使用方法与操作注意事项,需要的朋友可以参考下
    2018-07-07
  • SpringBoot配置SwaggerUI访问404错误的解决方法

    SpringBoot配置SwaggerUI访问404错误的解决方法

    这篇文章主要为大家详细介绍了SpringBoot配置SwaggerUI访问404错误的解决方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-12-12

最新评论