SpringCloud 如何使用feign时的复杂参数传递

Feign传参注意

最近在用SpringCloud尝试重构以前的项目,使用Feign客户端组件来调用微服务,经常出现参数传不过去变成null的问题,网上查了一下发现feign在参数上的使用还是有一定的限制的,主要是要注意:

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

2. 不支持@GetMapping类似注解声明请求,需使用

@RequestMapping(value = "url",method = RequestMethod.GET)

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

写了一个简单案例,同时传输一个对象和一个字符串作为请求参数,主要关注参数的声明,其余比如eureka和feign的依赖和配置和后续使用相关的知识请另行查阅。仅供参考

服务端(生产者)

准备:

1. 已经配置将服务注册在eureka,服务名为“item-service”

2. service层和dao层已经实现好了

逻辑:ItemController接收参数,调用service层,service中为商品Item对象添加详情desc,然后调用dao保存Item对象,返回Result结果封装对象

@RestController
public class ItemController {
    @Autowired
    private ItemService itemService;

    /**
     * 添加
     * @param item
     * @param desc
     * @return
     */
    @RequestMapping("/item/save")
    public Result addItem(@RequestBody Item item, @RequestParam("desc") String desc){
        return itemService.addItem(item, desc);
    }
}

客户端(消费者)

准备: 已经配置注册到eureka

逻辑:

声明ItemFeignClient调用eureka上名为"item-service"的服务,返回Result对象

使用Post请求,传递两个参数:

1. TbItem对象,使用@RequestBody来声明

2. String字符串,使用@RequestParam("xxx")来声明

@FeignClient("item-service")
public interface ItemFeignClient {

    /**
     * 添加
     * @param item
     * @param desc
     * @return
     */
    @RequestMapping(value = "/item/save",method = RequestMethod.POST)
    Result addItem(@RequestBody TbItem item, @RequestParam("desc") String desc); 

SpringCloud feign参数传递问题记录

对象传递 @RequestBody(required = false)

不支持多对象传递,至少我目前发现是这样的,如有错误或者改进的方法请提出

API层

@FeignClient(value = "transaction-feign")
    public interface TransactionApiService {
        /**
         * 交易流水查询 可分页
         *
         * @param param
         * @param pageNum
         * @param pageSize
         * @return
         */
        @RequestMapping(value = "/dealflow/list", method = RequestMethod.POST)
        JsonResultDO dealFlowList(@RequestBody(required = false) DealFlowDo param
                , @RequestParam(value = "pageNum", defaultValue = "1") Integer pageNum
                , @RequestParam(value = "pageSize", defaultValue = "20") Integer pageSize);
    }

接口层

/**
 * 交易流水查询 可分页
 * @return JsonResultDO
 */
@RequestMapping(value = "/dealflow/list", method = RequestMethod.POST)
public Page<DealFlowDo> dealFlowList(@RequestBody(required = false) DealFlowDo param
        , @RequestParam(value = "pageNum", defaultValue = "1") Integer pageNum
        , @RequestParam(value = "pageSize", defaultValue = "20") Integer pageSize
        , @RequestParam(value = "userId") Long userId){
    JsonResultDO resultDO = new JsonResultDO();
    Page<DealFlowDo> page = (Page<DealFlowDo> )dealFlowService.queryDealFlowList(userId, param, pageNum, pageSize);
    return page;
}

单个或多个参数传递 @RequestParam/@PathVariable/***

   /**
     * 根据商户号获取商户信息
     *
     * @param merNo
     * @return
     */
    @RequestMapping(value = "/merchant/{merNo}", method = RequestMethod.GET)
    String getMerchantByMerNo(@PathVariable("merNo") String merNo);

以上为个人经验,希望能给大家一个参考,也希望大家多多支持我们。

(0)

相关推荐

  • 详解spring cloud feign踩坑记录

    1:多客户端时,feign接口抽取到公共jar中,此时,客户端的启动类上需要对该jar中feign所在的包进行扫描,要在spring和feign中同时注册,否则启动时会报:"Consider defining a bean of type '******Feign' in your configuration." @SpringBootApplication @EnableTransactionManagement @EnableDiscoveryClient @ComponentSc

  • Spring Cloud中关于Feign的常见问题总结

    一.FeignClient接口,不能使用@GettingMapping 之类的组合注解 代码示例: @FeignClient("microservice-provider-user") public interface UserFeignClient { @RequestMapping(value = "/simple/{id}", method = RequestMethod.GET) public User findById(@PathVariable(&quo

  • 解决SpringCloud Feign传对象参数调用失败的问题

    SpringCloud Feign传对象参数调用失败 不支持GET请求方式 使用Apache HttpClient替换Feign原生httpclient @RequestBody接收json参数 bootstrap-local.yml feign: httpclient: enabled: true pom.xml <!-- 使用Apache HttpClient替换Feign原生httpclient --> <dependency> <groupId>com.netf

  • SpringCloud Feign参数问题及解决方法

    这篇文章主要介绍了SpringCloud Feign参数问题及解决方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 今天遇到使用Feign调用微服务,传递参数时遇到几个问题 1.无参数 以GET方式请求 服务提供者 @RequestMapping("/hello") public String Hello(){ return "hello,provider"; } 服务消费者 @GetMapping("

  • SpringCloud 如何使用feign时的复杂参数传递

    Feign传参注意 最近在用SpringCloud尝试重构以前的项目,使用Feign客户端组件来调用微服务,经常出现参数传不过去变成null的问题,网上查了一下发现feign在参数上的使用还是有一定的限制的,主要是要注意: 1. 当参数比较复杂时,feign即使声明为get请求也会强行使用post请求 2. 不支持@GetMapping类似注解声明请求,需使用 @RequestMapping(value = "url",method = RequestMethod.GET) 3. 使用

  • SpringCloud项目集成Feign、Hystrix过程解析

    这篇文章主要介绍了SpringCloud项目集成Feign.Hystrix过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 Feign的功能:这是个消费者,根据服务注册在Eureka的ID去找到该服务,并调用接口 Hystrix的功能:熔断器,假如A服务需要调用B服务的/cities接口获取数据,那就在A服务的controller里声明@HystrixCommand,如果B服务的/cities接口挂了,就返回一个自定义的值 项目结构 [r

  • Spring 使用 feign时设置header信息的操作

    Spring feign时设置header信息 最近使用 SpringBoot 项目,把一些 http 请求转为 使用 feign方式.但是遇到一个问题:个别请求是要设置header的. 于是,查看官方文档和博客,大致推荐两种方式.也可能是我没看明白官方文档. 接口如下: @FeignClient(url ="XX_url", value ="XXService") public interface XXService { @RequestMapping(value

  • springcloud本地调试feign调用出现的诡异404问题及解决

    目录 本地调试feign调用出现的诡异404问题 问题产生 技术框架 核心代码 诡异的404 心态 springcloud在本地调试的踩坑记录 1.在本地调试的时候 2.修改配置文件中关于eureka的配置 3.还是关于eureka的配置 本地调试feign调用出现的诡异404问题 问题产生 最近在给公司准备做分布式事务框架seata的调研,准备搭建一套demo,根据阿里云官网的案例,我准备搭建一套微服务架子,分别含有business.order.storage三个微服务组成,其中第一个微服务实

  • SpringCloud中的Feign远程调用接口传参失败问题

    目录 Feign远程调用接口传参失败 这是调用者 这是feign的client 这是被调者 Feign远程调用的注意点 定义的做远程调用的api接口 service微服务中的Controller的参数绑定 Feign远程调用接口传参失败 我在做一个微服务调用的时候出现了被调接口传参失败问题 Feign是通过http协议调用服务的,后来发现是因为Gep和Maping不一致,还有使用feign时要记得给实体类加无参构造注解 同时这些注解都尽量一致,不然微服务调bug很麻烦. 这是调用者 这是feig

  • 解决Feign调用的GET参数传递的问题

    目录 需求 思考 GET方式请求① GET方式请求② GET方式请求③ 需求 ​ 在消费方服务通过GET方式,访问服务提供方的接口,需要传递多参数,拆分成多个参数的方式访问,不太适合用在该场景,需要改造成合适的方式调用服务方的接口 思考 拆分成多个参数时,若GET请求的参数超过3个及以上时,便不适用该种方式请求服务,因为这样传递参数过于臃肿,可读性也比较差: 若改造成POST请求的方式,虽然解决参数过多的问题,但是也带来了其他的开销,参数被放到了body里面,然后请求到服务方提供的接口,服务方的

  • SpringCloud实战之Feign声明式服务调用

    在前面的文章中可以发现当我们通过RestTemplate调用其它服务的API时,所需要的参数须在请求的URL中进行拼接,如果参数少的话或许我们还可以忍受,一旦有多个参数的话,这时拼接请求字符串就会效率低下,并且显得好傻. 那么有没有更好的解决方案呢?答案是确定的有,Netflix已经为我们提供了一个框架:Feign. Feign是一个声明式的Web Service客户端,它的目的就是让Web Service调用更加简单.Feign提供了HTTP请求的模板,通过编写简单的接口和插入注解,就可以定义

  • springcloud如何使用Feign后台内部传递MultipartFile

    目录 如何使用Feign后台内部传递MultipartFile 先修改FeignClient接口 内部调用 注意点 Feign进行跨服务传递MultipartFile文件 通过feign进行跨服务传递MultipartFile文件 如何使用Feign后台内部传递MultipartFile 先修改Feign Client接口 import feign.codec.Encoder; import feign.form.spring.SpringFormEncoder; import org.spri

  • SpringCloud如何利用Feign访问外部http请求

    目录 Feign访问外部http请求 累死人的写法:(仅参考) 话不多说,先上pom.xml bootstap.yml部分配置 在spingbootApplication启动类上增加注解 FeignClient外部http请求 pom.xml引入openfeign2.0.2 启动类添加注解@EnableFeignClients 外部接口类.调用方式同service Feign访问外部http请求 大家好,目前接手了一个项目,具体的逻辑并不复杂,主要是一个"中间商"角色, 比如客户端通过

  • 关于feign调用的参数传递问题(@RequestBody和@RequestParam)

    目录 feign调用的参数传递问题 错误写法 正确写法 body的正确形式 feign传参总结 返回实体对象服务提供者 restful传参服务提供者 传实体对象服务提供者 feign调用的参数传递问题 SpringCloud Feign报错: java.lang.IllegalStateException: Method has too many Body parameters 上边的报错提示为body太多了,feign调用的方法里只能有一个body但是requestparam可以多个 错误写法

随机推荐