首页 > 解决方案 > 如何为 WebFlux APIS 中的每个自定义请求类设置 HttpHeaders 数据?

问题描述

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

我已经在 MVC 代码中完成了此操作,但不知道如何使用WebFlux(Library-Project Reactor)对反应式API执行此操作。

控制器:

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

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

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

标签: javaspringspring-webfluxreactive

解决方案


我会做以下事情:

  1. 为您的请求定义一些基类,这些基类将具有您想要存储标头值的属性,例如:

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

    public class GetDataRequest extends MyAbstractRequest {
        // GetDataRequest content here
    }
    
  3. 为所有继承自MyAbstractRequest. 为确保行为与正常请求主体反序列化的行为相同,请将其AbstractMessageReaderArgumentResolver用作基类:

     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. MyArgumentResolver在 webflux 配置中配置你的:

     @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){
     }
    

推荐阅读