feign返回null_Feign的传参研究

最近在将一个springbbot分布式SSO工程改造成基于springcloud的微服务工程 。在Feign端消费服务的时候传参数时候出现了一些问题,然后查了些资料,自己总结了下。特意记录下。

关于Feign消费服务时候get/post方式,单参,多参,可以看如下这篇文章:

https://blog.csdn.net/justry_deng/article/details/80785973

这篇文章讲解的很详细,主要分析@Requestparam和@RequestBody两个注解在使用POST/GET时候的具体情况。

总结一下:

现在说的是feign作为消费方去消费服务,

1get方式消费服务提供者:

a在所有参数前加上@RequestParam注解。method可加,可不加,为了简单,个人觉得直接加上。

2post方式消费服务提供者

a在所有参数前加上@RequestParam注解。method加上Post.

b 使用@RequestBody注解(有且至多一个,多了报错),其他的参数前,必须使用@RequstParam。

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

具体来说:分无参,单参和多参数

无参和单参的情况不在此列举。

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

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

注意:@RequstParam("name"),这个变量名说是可加,可不加(接受参数名字和传递过来变量名字一致时候),建议加上。测试时候省事。

服务提供者:

服务提供者的Controller中,

如果要接收(服务消费中传过来的)被@RequestBody指明的参数,那么对应方法的对应参数前一定要有@RequestBody;(如果没有的话,收到的参数值就为null;如果写成@RequestParam的话,那么feign调用会失败)

如果要接收(服务消费中传过来的)被@RequestParam指明的参数,那么可以写@RequestParam,也可以不写(当服务提供者中对应的参数名字与服务消费者传过来的参数名字一致时,可以不写,不一致时,需要写)

多参数:
1以get方式消费服务提供者

全部参数加上@RequestParam,method可加可不加,建议加上。

2以post方式消费服务提供者

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

如:

89dcbba74fc276b4f03290e18c94b28b.png

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

db9412f47f2ad3acf2c549c92557b2cb.png

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

640c67cc87f9c6b3636bce1a8184c7ba.png

服务提供者接收时:

◎如果服务消费者传过来参数时,全都用的是@RequestParam的话,那么服务提供者的Controller中对应参数前可以写@RequestParam,也可以不写(当两边参数名字一致时,可以省略不写)

◎如果服务消费者传过来参数时,有@RequestBody的话,那么服务提供者的Controller中对应参数前必须要写@RequestBody(如果是多参数的话,其余参数前视情况可以写@RequestParam,也可以不写)

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

@RequestBody和@RequestParam区别:参考如下文章。

https://blog.csdn.net/xinluke/article/details/52710706

最后指出一点postman中params传参对应的是@RequstParma接受,而body中application/json对应的Json串就是@RequestBody接收的。再使用Postman做测测试时候注意参数输入。

注意:服务提供者一般情况下,返回JSON,所以千万别漏了@RestController或者@ResponeBody.否则测试时候,要整半天。

针对最后一点,如果说从postman直接访问的Controller中通过feignclient的接口调用服务,那么如果controller的形参如果没有绑定@RequestBody,那么此时Springmvc默认采用的是接受参数方式是取request中的params中的参数,header中参数和body中的json格式的参数都不会被获取,只有在Controller行参上加了@RequestBody才能获取到(此问题在测试时候会出现)。

故:一般情况,接受页面传参,采用springmvc默认机制。

@RequestBody,一般用在feign的消费者和提供者之间传递复杂参数(对象和map)。底层原理:处理HttpEntity传递过来的数据,一般用来处理非Content-Type: application/x-www-form-urlencoded编码格式的数据

有不对的地方请指正。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值