Kotlin Spring WebFlux,提取请求主体
我正在编写一个小型WebFlux客户端代理,它将接受POST请求,提取JSON内容,并通过另一个POST将其传递给第三方web服务器的进一步调用。我想在我最初的POST请求中获得json正文Kotlin Spring WebFlux,提取请求主体,kotlin,spring-webflux,reactive,Kotlin,Spring Webflux,Reactive,我正在编写一个小型WebFlux客户端代理,它将接受POST请求,提取JSON内容,并通过另一个POST将其传递给第三方web服务器的进一步调用。我想在我最初的POST请求中获得json正文 curl --header "Content-Type: application/json" \ --request POST \ --data '{"username":"xyz", "preference":&quo
curl --header "Content-Type: application/json" \
--request POST \
--data '{"username":"xyz", "preference":"123"}' \
http://localhost:3000/mih/search
以下是我处理上述职位的途径:
@Bean
open fun route(searchService: SearchService): RouterFunction<ServerResponse> {
return RouterFunctions.route(
RequestPredicates.POST("/search").and(RequestPredicates.accept(MediaType.APPLICATION_JSON)),
HandlerFunction {
request: ServerRequest -> searchService.search(request.body(BodyExtractors.toMono(String::class.java)))
} )
}
如何成功提取请求正文?根据文档:
post()
返回WebClient.RequestBodyUriSpec
而不是ServerResponse
您使用的API不正确。您应该在search()
方法调用之后使用.retrieve()
在您的情况下,.body()
应用于POST请求正文
你应继续:
.search().retrieve().bodytomano(String.class)
根据文档:
post()
返回WebClient.RequestBodyUriSpec
而不是ServerResponse
您使用的API不正确。您应该在search()
方法调用之后使用.retrieve()
在您的情况下,.body()
应用于POST请求正文
你应继续:
.search().retrieve().bodytomano(String.class)
WebClient.post(json)
我以前没有见过这个函数,在api声明中也找不到它。您需要调用exchange
或retretrieve
来执行请求,然后获取响应并将主体提取并映射到某个对象。您可以在官方文档@MeanwhileInHell中阅读更多关于WebClient用法的信息-我认为您应该在WebClient上调用bodyToMono
,然后将字符串包装到ServerResponse
WebClient.post(json)的新对象中,我以前没有见过这个函数,我在api声明中找不到它。您需要调用exchange
或retretrieve
来执行请求,然后获取响应并将主体提取并映射到某个对象。您可以在官方文档@MeanwhileInHell中阅读更多关于WebClient用法的信息-我认为您应该在您的WebClient上调用bodyToMono
,然后将字符串包装到ServerResponse
的新对象中抱歉,我的问题应该更简洁。我正在通过WebClient的调用调用retrieve()
。我已经编辑了我的答案,以包含我自己的web客户端代码和扩展的背景信息。但是,您不能调用.bodytomino(ServerResponse::class.java)
并期望它自动转换为响应,您可以做的是调用bodytomino()
,然后map
返回ServerResponse
。Reactor不知道如何将某种字符串映射到ServerResponse
,也不知道返回哪个状态代码……抱歉,我的问题应该更简洁。我正在通过WebClient的调用调用retrieve()
。我已经编辑了我的答案,以包含我自己的web客户端代码和扩展的背景信息。但是,您不能调用.bodytomino(ServerResponse::class.java)
并期望它自动转换为响应,您可以做的是调用bodytomino()
,然后map
返回ServerResponse
。Reactor不知道如何将某种字符串映射到ServerResponse
,也不知道返回哪个状态代码。。。
open class SearchService(private val myWebClient: MyWebClient): ISearchService {
override fun search(json: String): Mono<ServerResponse> {
return myWebClient.myPost(json)
}
}
import org.springframework.web.reactive.function.client.WebClient
open class MyWebClient(
private val springWebClient: WebClient,
private val properties: properties ) : IMyWebClient {
override fun myPost(json: String): Mono<ServerResponse> {
return springWebClient.post()
.uri("/{base}/queries", properties.getBase)
.body(
BodyInserters.fromPublisher(Mono.just(json), String::class.java)
).retrieve().bodyToMono(
ServerResponse::class.java
)
}
}
Type mismatch.
Required: String
Found: Disposable