微服务调用其他服务的api传值丢失问题记录

首先解决问题:

问题:微服务之间的api调用出现为服务方提供参数传值的时候出现了传值丢失的问题,

排查:在服务方的api接口写的时候参数值没有添加参数类型注解导致传值丢失。

如:服务B里面的Api接口,

没有添加@RequestParam(name = "benefitId")

@ApiOperation("列表")
@GetMapping("/v1/getBenefitPropInfo")
BenefitProprietorVO getBenefitPropInfo(Long benefitId);

则在服务a里面调用的话是以Http请求的url方式去请求调用的,这样的形式在调用方那边就调用的是http.../v1/getBenefitPropInfo

没有识别到有参数则这边便会默认这个方法是没有参数的,所以即使你把值传过去,也是无效的。服务方在http请求里面无法查找到相关的参数;

加了 @RequestParam(name = "benefitId") 

则是为方法提供了一定的参数识别,即告诉那边说你需要的参数是什么,调用方才会把参数加入请求的url上面

所以本次问题的解决方案是把@RequestParam(name = "benefitId") 加上就能正常接收参数了。

 

顺便长点见识:

问题总是试着试着就弄好了,但是其中缘由却没能理解透彻,也不知为什么这样就能处理就可以那样也不可以。

总之所有的问题都是你的姿势不对造成的,你的姿势决定你的bug数目,我是在看另外一个问题的时候想起了这个问题的原因,其实这个服务方那边无法接收参数也是有一定出入的。

其中主要涉及了一个@RequestParam加与不加的区别,明白了这个区别以及其中调用原理便能明白其中的问题。

 

一般编写controller层的时候都是默认带上 @RequestParam 编写api也是,但是其实不加@RequestParam 也能接收到参数

加与不加的区别主要如下

这里有两种写法

@RequestMapping("/list")
    public String test(@RequestParam  Long parentId) {
       
    }
@RequestMapping("/list")
    public String test( Long parentId) {
        
    }

第一种必须带有参数,你直接输入localhost:8080/list 会报错 不会执行方法 只能输入localhost:8080/list?parentId=? 才能执行相应的方法

设置 @RequestParam 里面的required为false(默认为true 代表必须带参数) 这样就跟第二种是一样的了@RequestParam(required=false)


可以设置里面的defaultValue的属性
如下:  @RequestParam(defaultValue="0") 
这样在地址里面也可以不带参数,如果带了参数会接收,不带参数会默认为0


第二种 不加 @RequestParam,可带参数也可不带参数  你输入  localhost:8080/list  以及 localhost:8080/list?parentId=?  方法都能执行

但是这种写法是有一定的风险的,大佬给我讲解的其中原理是,这里面的参数定义在编译的时候是容易被擦除掉的,在请求的时候他需要值就会去header里面找或者到body里面找,但是找到的不一定会是对应的参数,也有可能是一些乱七八糟的东西,如果前端传过来的参数是带了?parentId=?的这边就会默认获取?号后面的第一个就会出现数据不对应等问题,一个的话还可以,但是如果是多个参数的话就容易报错,

所以还是加上@RequestParam避免会出现很多奇奇怪怪的问题。

 

你可能感兴趣的:(软件问题解决)