【问题标题】:How to send URL encoded data in spring webflux如何在spring webflux中发送URL编码数据
【发布时间】:2020-04-07 09:40:31
【问题描述】:

我正在编写一个 spring 5 网络应用程序,我的要求是获取一个 urlencoded 表单并作为响应发送回 url 编码响应

这是路由器功能代码

@Configuration
public class AppRoute {

  @Bean
  public RouterFunction<ServerResponse> route(FormHandler formHandler) {

    return RouterFunctions.route()
           // .GET("/form", formHandler::sampleForm)
           // .POST("/form", accept(MediaType.APPLICATION_FORM_URLENCODED), formHandler::displayFormData)
            .POST("/formnew", accept(MediaType.APPLICATION_FORM_URLENCODED).and(contentType(MediaType.APPLICATION_FORM_URLENCODED)), formHandler::newForm)
            .build();
  }
}

这是我的处理程序代码

public Mono<ServerResponse> newForm(ServerRequest request) {
    Mono<MultiValueMap<String, String>> formData = request.formData();
    MultiValueMap<String, String> newFormData = new LinkedMultiValueMap<String, String>();

    formData.subscribe(p -> newFormData.putAll(p));
    newFormData.add("status", "success");

    return ServerResponse.ok().contentType(MediaType.APPLICATION_FORM_URLENCODED)
            .body(fromObject(newFormData));
}

这是我得到的错误

2020-04-07 02:37:33.329 调试 38688 --- [ctor-http-nio-3] org.springframework.web.HttpLogging:[07467aa5] 已解决 [UnsupportedMediaTypeException: Content type 'application/x-www HTTP POST /formnew 的 bodyType=org.springframework.util.LinkedMultiValueMap] 不支持 -form-urlencoded'

这里有什么问题。我找不到任何方法来写回 url 编码的响应。 谁能指出问题所在。

【问题讨论】:

    标签: spring-boot spring-webflux


    【解决方案1】:

    尝试将代码重构为函数式风格:

    public Mono<ServerResponse> newForm(ServerRequest request) {
        Mono<DataBuffer> resultMono = request.formData()
            .map(formData -> new LinkedMultiValueMap(formData))
            .doOnNext(newFormData -> newFormData.add("status", "success"))
            .map(linkedMultiValueMap -> createBody(linkedMultiValueMap));
    
        return ServerResponse.ok().contentType(MediaType.APPLICATION_FORM_URLENCODED)
            .body(BodyInserters.fromDataBuffers(resultMono));
    
    
    }
    
    private DataBuffer createBody(MultiValueMap multiValueMap) {
        try {
            DefaultDataBufferFactory factory = new DefaultDataBufferFactory();
            return factory.wrap(ByteBuffer.wrap(objectMapper.writeValueAsString(multiValueMap).getBytes(StandardCharsets.UTF_8)));
        } catch (JsonProcessingException e) {
            throw new IllegalArgumentException("incorrect body");
        }
    }
    

    【讨论】:

    • 我理解这个问题,所以抛出异常是因为 APPLICATION_FORM_URLENCODED 类型与 LinkedMultiValueMap 对象和其他相同的对象不兼容,例如,如果你替换为 APPLICATION_JSON - 它会正常工作。所以需要找到一种方法来创建正确的身体。
    • 我用一个小技巧更新了代码,现在应该可以了。
    • 谢谢.. 我通过构建 url 编码字符串解决了
    猜你喜欢
    • 2021-02-09
    • 2020-04-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-18
    • 2018-10-25
    • 2018-08-17
    • 1970-01-01
    相关资源
    最近更新 更多