如何在 WebFlux APIS 中为每个自定义请求 Class 设置 HttpHeaders 数据?

How to set HttpHeaders data to every Custom Request Class in WebFlux APIS?

在我的 API 中,每个 API 都有自定义请求 class,我想编写代码从即将到来的请求中获取来自 HttpHeaders 的字段,并将该组字段设置为特定的 请求class,因此它将对所有请求class执行此操作。

我已经在 MVC 代码中完成了此操作,但不知道如何使用 WebFlux(Library-反应堆项目)。

控制器:

public Mono<ResponseEntity<JsonNode>> getData(@RequestHeader HttpHeaders header, GetDataRequest request){
  .... // all stuff
 }

现在一些数据来自 header,例如 typetokencomID 等。 我想在进一步处理请求之前将这些字段设置为 Request Class GetDataRequest 因为我将进一步需要这些字段, 但是这个请求 class 对于所有请求都是不同的,所以我需要通用代码,将它设置为传递给它的任何请求 class 。 注意:这里不用WebClient,只有FluxMono

所以基本上,从类型为 HttpHeaders 的 header 获取字段,将这些数据设置为特定请求 class,但在 WebFlux Framework 中执行此操作,反应式 APIS。 请帮助任何人。

我会做以下事情:

  1. 为您的请求定义一些基础 class,其中包含您想要存储 headers 值的属性,例如:

    public class MyAbstractRequest {
        private String header1;
        private String header2;
        // ...
        // getters and setters
    }
    
  2. 从这个 class 继承所有你请求的 classes,例如:

    public class GetDataRequest extends MyAbstractRequest {
        // GetDataRequest content here
    }
    
  3. 为所有继承自 MyAbstractRequest 的 classes 创建一个 argumentResolver。为确保行为与正常请求 body 反序列化相同,请使用 AbstractMessageReaderArgumentResolver 作为基础 class:

     public class MyArgumentResolver extends AbstractMessageReaderArgumentResolver {
    
       public MyArgumentResolver(List<HttpMessageReader<?>> messageReaders, ReactiveAdapterRegistry adapterRegistry) {
         super(messageReaders, adapterRegistry);
       }
    
       @Override
       public boolean supportsParameter(MethodParameter parameter) {
         return MyAbstractRequest.class.isAssignableFrom(parameter.getParameterType());
       }
    
       @Override
       public Mono<Object> resolveArgument(MethodParameter parameter, BindingContext bindingContext, ServerWebExchange exchange) {
         return readBody(parameter, true, bindingContext, exchange)
           .map(o -> {
             // your headers extraction logic here ...
             ((MyAbstractRequest) o).setHeader1(exchange.getRequest().getHeaders().getFirst("header1"));
             ((MyAbstractRequest) o).setHeader2(exchange.getRequest().getHeaders().getFirst("header2"));
             return o;
           });
        }
     }
    
  4. 在webflux配置中配置你的MyArgumentResolver

     @Configuration
     public class WebFluxConfiguration implements WebFluxConfigurer {
    
       @Autowired
       ApplicationContext applicationContext;
    
       @Override
       public void configureArgumentResolvers(ArgumentResolverConfigurer configurer) {
         ServerCodecConfigurer serverCodecConfigurer = applicationContext.getBean(ServerCodecConfigurer.class);
         ReactiveAdapterRegistry reactiveAdapterRegistry = applicationContext.getBean("webFluxAdapterRegistry", ReactiveAdapterRegistry.class);
         configurer.addCustomResolver(new MyArgumentResolver(serverCodecConfigurer.getReaders(), reactiveAdapterRegistry));
       }
     }
    
  5. 现在您的请求应该通过配置的解析器注入到控制器方法中:

     public Mono<ResponseEntity<JsonNode>> getData(GetDataRequest request){
     }