java - 如何为 WebFlux APIS 中的每个自定义请求类设置 HttpHeaders 数据?
问题描述
在我的 API 中,每个 API 都有一个自定义请求类,我想编写代码HttpHeaders
从即将到来的请求中获取字段,并将该组字段设置为特定的请求类,因此它将为所有请求类执行此操作。
我已经在 MVC 代码中完成了此操作,但不知道如何使用WebFlux(Library-Project Reactor)对反应式API执行此操作。
控制器:
public Mono<ResponseEntity<JsonNode>> getData(@RequestHeader HttpHeaders header, GetDataRequest request){
.... // all stuff
}
现在一些数据来自header
像type
,,token
等comID
。我想GetDataRequest
在进一步处理请求之前将这些字段设置为请求类,因为我将需要这些字段,但是这个请求类对于所有请求都不同,所以我需要通用代码,它将它设置为传递给它的任何请求类。注意:WebClient
这里不使用,只有Flux
和Mono
都在那里。
所以基本上,从类型为的标头中获取字段HttpHeaders
,将这些数据设置为特定的请求类,但在 WebFlux 框架中执行此操作,反应式 APIS。请帮助任何人。
解决方案
我会做以下事情:
为您的请求定义一些基类,这些基类将具有您想要存储标头值的属性,例如:
public class MyAbstractRequest { private String header1; private String header2; // ... // getters and setters }
从这个类继承所有你请求的类,例如:
public class GetDataRequest extends MyAbstractRequest { // GetDataRequest content here }
为所有继承自
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; }); } }
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)); } }
现在您的请求应该使用配置的解析器注入到控制器方法中:
public Mono<ResponseEntity<JsonNode>> getData(GetDataRequest request){ }
推荐阅读
- c++ - 'localtime_s': 不是 VS2015 中'std' 的成员
- laravel - 试图在 Facebook twitter LinkedIn 上分享帖子无法使用 Laravel 发布或分享的第三方帐户
- javascript - 如何将 Javascript 作为字符串传递给 HTML 函数
- groovy - Groovy == 不符合规范
- asp.net-mvc - 如何首先在实体框架代码中添加 HttpPostedFileBase 类型的属性
- .net - Stripe 付费流程和免费计划订阅
- javascript - 部分循环中未定义的变量,输出
- mesh - 如何在 Avizo 中细化某些特定表面?
- php - TeamSpeak 3 (Ts3Admin.class.php)
- javascript - JavaScript:查找附近的设备