spring 内容类型“application/x-www-form-urlencoded”不适用于WebFlux应用程序的@RequestBody

xjreopfe  于 2023-03-16  发布在  Spring
关注(0)|答案(2)|浏览(180)

基于关于主题“”application/x-www-form-urlencoded“不与@RequestBody一起工作”的多个线程,我尚未成功找到WebFlux Spring应用程序的解决方案。
我有一个WebFlux控制器方法:

@PostMapping(value = "/endpoint", consumes = MediaType.APPLICATION_FORM_URLENCODED_VALUE)
        public Mono<AddRecipientResponse> createRecipient(@RequestBody
                                                  final MultiValueMap<String, String> formData,
                                                  @RequestHeader
                                                  final Map<String, String> headers) {

但是当我发布我的请求时,我得到这个错误:

Could not resolve parameter [0] ... RecipientController.createRecipient(long,org.springframework.util.MultiValueMap<java.lang.String, java.lang.String>,java.util.Map<java.lang.String, java.lang.String>): 415 UNSUPPORTED_MEDIA_TYPE

大多数解决方案依赖于用@RequestParam替换@RequestBody。但是这不适用于我的情况。我需要同时拥有@RequestBodyconsumes = MediaType.APPLICATION_FORM_URLENCODED_VALUE。我尝试了以下线程中描述的步骤,但它们都是针对Spring MVC的。
https://stackoverflow.com/a/70148328/18734587
https://stackoverflow.com/a/51160620/18734587
有人知道如何解决WebFlux应用程序的MediaType.APPLICATION_FORM_URLENCODED@RequestBody请求的415 UNSUPPORTED_MEDIA_TYPE错误吗?

oprakyz7

oprakyz71#

我自己想到了一个解决方案,请求主体从ServerWebExchange.getFormData()中提取出来,如下所示:

@PostMapping(value = "/endpoint", consumes = MediaType.APPLICATION_FORM_URLENCODED_VALUE)
    public Mono<AddRecipientResponse> createRecipient(@RequestHeader final Map<String, String> headers,
                                                      ServerWebExchange serverWebExchange) {

        return serverWebExchange.getFormData()
                .flatMap(formData -> recipientService.createRecipient(headers, formData));
    }
jv2fixgn

jv2fixgn2#

我已经为此挣扎了一个早上。从文档注解@RequestParam
支持Spring MVC和Spring WebFlux中带注解的处理程序方法,如下所示:
在SpringMVC中,“请求参数”Map到查询参数、表单数据和多部分请求中的部分,这是因为API将查询参数和表单数据组合到一个称为“参数”的Map中,其中包括请求正文的自动解析。
在SpringWebFlux中,“requestparameters”只Map到查询参数,要处理所有的查询、表单数据和多部分数据,可以使用数据绑定到用ModelAttribute注解的命令对象。
然后在尝试使用Spring WebFlux文档中的@ModelAttribute后,在文档中实现此功能的唯一方法是:
https://docs.spring.io/spring-framework/docs/current/reference/html/web-reactive.html#webflux-form-data
带有注解控制器的Java:

@PostMapping(value = "/endpoint", consumes = MediaType.APPLICATION_FORM_URLENCODED_VALUE)
public String createRecipient(ServerWebExchange serverWebExchange) {

    MultiValueMap<String, String> formData = serverWebExchange.getFormData().block();
    return formData.toString();
}

带有注解控制器和协程的Kotlin:

@PostMapping(value = ["/endpoint"], consumes = [MediaType.APPLICATION_FORM_URLENCODED_VALUE])
suspend fun createRecipient(serverWebExchange: ServerWebExchange): String? {
    val formData: MultiValueMap<String, String> = serverWebExchange.formData.awaitSingle()
    return formData.toString()
}

相关问题