Method 路由断言工厂接收一个方法参数,该参数可以指定一个或多个 HTTP 请求方法,多个方法使用逗号(,)进行分割。例如:
spring:
cloud:
gateway:
routes:
- id: method_route
uri: https://example.org
predicates:
- Method=GET,POST上面配置,如果请求方法是 GET 或 POST,该路由将与之匹配。
将“Gateway 搭建网关服务”项目的配置文件 bootstrap.yml 内容使用如下配置替换:
server:
# 网关端口
port: 9000
spring:
application:
# 服务名称
name: gateway-demo01
cloud:
# nacos
nacos:
discovery:
server-addr: localhost:8848
username: nacos
password: nacos
group: DEFAULT_GROUP
# 网关路由配置
gateway:
# 网关路由配置
routes:
# 路由id,自定义,只要唯一集合
- id: service-order
# 路由的目标地址,lb 就是负载均衡,后面跟服务名
# 需要集成 nacos 等服务注册中心
uri: lb://service-order
# 路由断言,也就是判断请求是否符合路由规则的条件
predicates:
# Method断言:匹配请求方法为 GET 的请求
- Method=GET修改好配置后,重启网关服务,使用 Postman 访问订单服务。如下图:

如果将 Method 断言改为:
Method=POST重启网关服务,继续访问接口,如下图:

下面是 Method 路由断言工厂的源码:
package org.springframework.cloud.gateway.handler.predicate;
//...
public class MethodRoutePredicateFactory extends AbstractRoutePredicateFactory<MethodRoutePredicateFactory.Config> {
public static final String METHOD_KEY = "method";
public MethodRoutePredicateFactory() {
super(Config.class);
}
@Override
public List<String> shortcutFieldOrder() {
return Arrays.asList(METHOD_KEY);
}
@Override
public Predicate<ServerWebExchange> apply(Config config) {
return exchange -> {
// 从请求对象中获取方法信息
HttpMethod requestMethod = exchange.getRequest().getMethod();
// 将请求的方法和配置的方法进行比较
return requestMethod == config.getMethod();
};
}
public static class Config {
private HttpMethod method;
// 配置信息
}
}