Kotlin Spring WebFlux,提取请求主体

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

我正在编写一个小型WebFlux客户端代理,它将接受POST请求,提取JSON内容,并通过另一个POST将其传递给第三方web服务器的进一步调用。我想在我最初的POST请求中获得json正文

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