Spring WebClient Post方法主体

问题描述 投票:0回答:1

我正在尝试发送带有正文数据的POST请求,如此处所述:https://scrapyrt.readthedocs.io/en/stable/api.html#post

这是我尝试做的,但是给了我HTTP代码500

String uri = "http://localhost:3000";

WebClient webClient = WebClient.builder()  
            .baseUrl(uri)
            .build();
LinkedMultiValueMap map = new LinkedMultiValueMap();

        String q = "\"url\": \"https://blog.trendmicro.com/trendlabs-security-intelligence\",\"meta\":{\"latestDate\" : \"18-05-2020\"}}";
        map.add("request", q);
        map.add("spider_name", "blog");

        BodyInserter<MultiValueMap<String, Object>, ClientHttpRequest> inserter2
         = BodyInserters.fromMultipartData(map);

        Mono<ItemsList> result = webClient.post()
                                          .uri(uriBuilder -> uriBuilder
                                                           .path("/crawl.json")
                                                           .build())
                                          .body(inserter2)
                                          .retrieve()
                                          .bodyToMono(ItemsList.class);

        ItemsList tempItems = result.block();
spring rest spring-webflux
1个回答
0
投票

这是我尝试做的,但是给了我HTTP代码500

最有可能是因为您以错误的格式和错误的类型混合发送了错误的数据:

  • 您使用的是多部分表单数据,而不是JSON
  • 然后您将request参数设置为JSON字符串(q
  • 您在q中使用的JSON字符串甚至都不有效(至少缺少一个花括号),而手写JSON几乎普遍不是一个好主意,而是利用框架代您完成。) >
  • 相反,通常要做的是创建一个映射到您的请求的POJO结构,因此:

public class CrawlRequest {

    private CrawlInnerRequest request;
    @JsonProperty("spider_name")
    private String spiderName;

    //....add the getters / setters
}

public class CrawlInnerRequest {

    private String url;
    private String callback;
    @JsonProperty("dont_filter")
    private String dontFilter;

    //....add the getters / setters
}

...然后只需创建一个CrawlRequest,根据需要设置值,然后在调用中使用:

.body(BodyInserters.fromValue(crawlRequest))

这是使用WebClient的相当基本的基本部分。我建议您更广泛地阅读以使自己对基本原理有更好的了解,从长远来看,这将极大地帮助您。

最新问题
© www.soinside.com 2019 - 2024. All rights reserved.