2

我正在使用spring cloud gateway实现API路由,在一个用例中,我需要从传入请求中获取标头值并将其用于某些处理,进一步将此处理后的值作为标头添加到传出(路由)API调用中。如何从 routeBuilder 中的传入 API 调用中获取标头值?

@Bean
public RouteLocator customRouteLocator(RouteLocatorBuilder routeBuilder) {
    return routeBuilder.routes()
        .route(r -> r.path("/api/v1/**")
        .setRequestHeader("testKey", "testValue")
        .uri("URL"))
        .build();
}
4

2 回答 2

3

您可以为此编写自定义过滤器。它只是一种解决方法,不确定执行此操作的最佳方法是什么:

public class SomeFilterFactory
        extends AbstractGatewayFilterFactory<SomeFilterFactory.SomeConfig> {



    public SomeFilterFactory() {
        super(SomeFilterFactory.SomeConfig.class);
    }

    @Override
    public GatewayFilter apply(SomeFilterFactory.SomeConfig config) {

        return (exchange, chain) -> {
            ServerHttpRequest request = exchange.getRequest();
            String someHeader = request.getHeaders().getFirst("someHeader");
            // do your things here
            return chain.filter(exchange);
        };
    }

    public static class SomeConfig {
        // your config if required
        // or use name value config

    }

}
于 2018-07-16T06:23:51.623 回答
0

从 Predicate 获取传入的请求/响应。

@Bean
public RouteLocator customRouteLocator(RouteLocatorBuilder builder) {
    return builder.routes().route("default-api-route", new Function<PredicateSpec, Route.AsyncBuilder>() {
        @Override
        public Route.AsyncBuilder apply(PredicateSpec predicateSpec) {
            return predicateSpec.predicate(new Predicate<ServerWebExchange>() {
                @Override
                public boolean test(ServerWebExchange serverWebExchange) {
                    // get request header here
                    return false;
                }
            }).uri("http://httpbin.org").order(10000);
        }
    }).build();
}        
于 2020-09-21T08:28:22.347 回答