如何修改spring cloud gateway以正确获取并处理请求体内容?

2026-04-30 08:282阅读0评论SEO教程
  • 内容介绍
  • 文章标签
  • 相关推荐

本文共计1086个文字,预计阅读时间需要5分钟。

如何修改spring cloud gateway以正确获取并处理请求体内容?

在Spring Cloud Gateway中获取请求体的内容,不限于GET请求,并确保能够获取所有请求体的内容,可以按照以下步骤进行:

1. 配置Gateway路由: 在`application.yml`或`application.properties`中配置路由规则,确保可以拦截到所有类型的请求。

yaml spring: cloud: gateway: routes: - id: body-route uri: lb://YOUR-SERVICE-ID predicates: - Path=/any-path filters: - name: RequestBodyFilter

2. 创建RequestBodyFilter: 创建一个自定义过滤器,用于获取请求体的内容。

java import org.springframework.cloud.gateway.filter.GatewayFilterChain; import org.springframework.cloud.gateway.filter.GlobalFilter; import org.springframework.core.Ordered; import org.springframework.http.server.reactive.ServerHttpRequest; import org.springframework.stereotype.Component; import org.springframework.web.server.ServerWebExchange;

@Component public class RequestBodyFilter implements GlobalFilter, Ordered {

@Override public Mono filter(ServerWebExchange exchange, GatewayFilterChain chain) { ServerHttpRequest request=exchange.getRequest(); if (request.getHeaders().getContentLength() > 0) { request.getHeaders().set(X-RequestBody, request.getRequestBody().toString()); } return chain.filter(exchange); }

@Override public int getOrder() { return -100; } }

3. 配置全局过滤器: 在`application.yml`中配置全局过滤器,确保它在所有路由中生效。

yaml spring: cloud: gateway: default-filters: - RequestBodyFilter

4. 测试: 发送一个包含请求体的POST请求到配置的路由,检查响应头中是否包含`X-RequestBody`字段,其值应为请求体的内容。

shell curl -X POST -d '{key:value}' http://localhost:8080/any-path

检查响应头:

shell X-RequestBody: {key:value}

这样,无论请求类型如何,Spring Cloud Gateway都能够获取到请求体的内容。

之前写过一篇文章,如何获取body的内容。

Spring Cloud Gateway获取body内容,不影响GET请求

确实能够获取所有body的内容了,不过今天终端同学调试接口的时候和我说,遇到了400的问题,报错是这样的HTTP method names must be tokens,搜了一下,都是说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,即便写了两个也不生效,如

如何修改spring cloud gateway以正确获取并处理请求体内容?

结果就只有header被打印了

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

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

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

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

可以看到结果

发现header和param都传过来了。

以上这篇解决spring cloud gateway 获取body内容并修改的问题就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持易盾网络。

本文共计1086个文字,预计阅读时间需要5分钟。

如何修改spring cloud gateway以正确获取并处理请求体内容?

在Spring Cloud Gateway中获取请求体的内容,不限于GET请求,并确保能够获取所有请求体的内容,可以按照以下步骤进行:

1. 配置Gateway路由: 在`application.yml`或`application.properties`中配置路由规则,确保可以拦截到所有类型的请求。

yaml spring: cloud: gateway: routes: - id: body-route uri: lb://YOUR-SERVICE-ID predicates: - Path=/any-path filters: - name: RequestBodyFilter

2. 创建RequestBodyFilter: 创建一个自定义过滤器,用于获取请求体的内容。

java import org.springframework.cloud.gateway.filter.GatewayFilterChain; import org.springframework.cloud.gateway.filter.GlobalFilter; import org.springframework.core.Ordered; import org.springframework.http.server.reactive.ServerHttpRequest; import org.springframework.stereotype.Component; import org.springframework.web.server.ServerWebExchange;

@Component public class RequestBodyFilter implements GlobalFilter, Ordered {

@Override public Mono filter(ServerWebExchange exchange, GatewayFilterChain chain) { ServerHttpRequest request=exchange.getRequest(); if (request.getHeaders().getContentLength() > 0) { request.getHeaders().set(X-RequestBody, request.getRequestBody().toString()); } return chain.filter(exchange); }

@Override public int getOrder() { return -100; } }

3. 配置全局过滤器: 在`application.yml`中配置全局过滤器,确保它在所有路由中生效。

yaml spring: cloud: gateway: default-filters: - RequestBodyFilter

4. 测试: 发送一个包含请求体的POST请求到配置的路由,检查响应头中是否包含`X-RequestBody`字段,其值应为请求体的内容。

shell curl -X POST -d '{key:value}' http://localhost:8080/any-path

检查响应头:

shell X-RequestBody: {key:value}

这样,无论请求类型如何,Spring Cloud Gateway都能够获取到请求体的内容。

之前写过一篇文章,如何获取body的内容。

Spring Cloud Gateway获取body内容,不影响GET请求

确实能够获取所有body的内容了,不过今天终端同学调试接口的时候和我说,遇到了400的问题,报错是这样的HTTP method names must be tokens,搜了一下,都是说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,即便写了两个也不生效,如

如何修改spring cloud gateway以正确获取并处理请求体内容?

结果就只有header被打印了

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

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

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

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

可以看到结果

发现header和param都传过来了。

以上这篇解决spring cloud gateway 获取body内容并修改的问题就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持易盾网络。