首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Spring WebClient Post方法主体

Spring WebClient Post方法主体
EN

Stack Overflow用户
提问于 2020-05-29 03:29:07
回答 2查看 9.3K关注 0票数 3

我尝试发送一个包含正文数据的POST请求,如下所示:https://scrapyrt.readthedocs.io/en/stable/api.html#post

下面是我尝试做的事情,但它给出了HTTP代码500

代码语言:javascript
复制
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();
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-05-31 05:42:28

下面是我试图做的事情,但它给了我HTTP500代码

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

  • 您正在使用多部分表单数据,而不是JSON
  • 然后将request参数设置为JSON字符串(q)
  • The您在request中使用的JSON字符串甚至都是无效的(它至少缺少一个左花括号)-而且手写JSON几乎普遍是一个糟糕的主意,利用一个框架来为您做这件事。

相反,通常的做法是创建一个映射到您的请求的POJO结构,因此:

代码语言:javascript
复制
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
}

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

代码语言:javascript
复制
.body(BodyInserters.fromValue(crawlRequest))

这是使用WebClient的一个相当基础、基本的部分。我建议更广泛地阅读,让自己更好地理解基础知识,从长远来看,这将非常有帮助。

票数 3
EN

Stack Overflow用户

发布于 2021-11-29 08:43:03

对我来说,以下代码起作用了:

代码语言:javascript
复制
public String wcPost(){

    Map<String, String> bodyMap = new HashMap();
    bodyMap.put("key1","value1");
 

    WebClient client = WebClient.builder()
            .baseUrl("domainURL")
            .build();


    String responseSpec = client.post()
            .uri("URI")
            .headers(h -> h.setBearerAuth("token if any"))
            .body(BodyInserters.fromValue(bodyMap))
            .exchange()
            .flatMap(clientResponse -> {
                if (clientResponse.statusCode().is5xxServerError()) {
                    clientResponse.body((clientHttpResponse, context) -> {
                        return clientHttpResponse.getBody();
                    });
                    return clientResponse.bodyToMono(String.class);
                }
                else
                    return clientResponse.bodyToMono(String.class);
            })
            .block();

    return responseSpec;
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62073018

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档