springcloud gateway之addRequestParameter详细使用及踩坑注意

SpringCloud的网关gateway提供了多个内置Filter,其中addRequestHeader是添加header的,这个无坑,比较简单。还有一个添加参数的,addRequestParameter,这个就有点问题了。具体往下看。

版本如下,请注意Springboot版本,这是本篇Post请求异常的关键。

1 对应的uri只能是get请求

看一个简单的示例,addRequestParameter,我们匹配/addParam请求,并将请求转发至http://localhost:8888/header

这个是8888端口的服务

如果发起Get请求到网关,那么可以正常请求,一切OK。此时,调用发起方和最终的服务提供方都是Get请求,没有问题。

如果发起的请求是Get,但是服务提供方是如下的Post。

注意,这里我用了PostMapping,然后分别启动两个工程,再访问localhost:8080/addParam,而后会报错,这个也可以理解。

但是,如果调用发起方和服务提供方都是Post请求,理论上应该也是OK的。

但是事实上不是的

网关程序会报错如下:

这个就很尴尬了,作为一个网关,居然在代理非Get请求时出现异常,必然是不能容忍的。

经过一番探索,发现这是Springboot不同版本的原因导致,在Springboot2.0.5之前,不存在该问题,之后就有这种问题了。需要加以注意,解决方案会在下一篇写。

 

2 添加的参数value值必须合法(不能含有空格)

上面已经知道了,addRequestParameter对应的后端请求是Get型,那么明显添加的parameter只能是Get请求支持的,能在浏览器地址栏直接敲上去合法的。

这里,我将value的值变成带空格的,然后去访问后端的服务。

然后会发现控制台报错,Invalid URI query。这是因为get请求的value值不能含有非法字符.

同理

像这样的,后台接收的是

如果是这样的参数

后台这样

结果是:

这样就可以添加多个parameter了。

同时添加header和parameter

结束了addRequestParameter的说明,我们可以来看看,假如某个path,既想addHeader,又想addParameter,而系统的这两个方法,都是一个path只能搭配一个add的filter,即便写了两个也不生效,如

结果就只有header被打印了

那么就是想同时添加header和parameter该怎么办呢。

貌似通过java代码是无法实现了,好在可以通过yml配置来实现。

spring:
  cloud:
    gateway:
      routes:
      - id: header
        uri: http://localhost:8888/header
        filters:
        - AddRequestHeader=NewHeader, Bar
        - AddRequestParameter=NewParam, Param
        predicates:
        - Path=/header

在yml就可以在filters里,添加多个filter了,注意不要写错了filter的名字。

可以看到结果

发现header和param都传过来了。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

天涯泪小武

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值