我尝试发送一个包含正文数据的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();发布于 2020-05-31 05:42:28
下面是我试图做的事情,但它给了我HTTP500代码
最有可能的原因是您以错误的格式和错误的类型混合发送了错误的数据:
request参数设置为JSON字符串(q)request中使用的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
}...then只需创建一个CrawlRequest,根据需要设置值,然后在post调用中使用:
.body(BodyInserters.fromValue(crawlRequest))这是使用WebClient的一个相当基础、基本的部分。我建议更广泛地阅读,让自己更好地理解基础知识,从长远来看,这将非常有帮助。
发布于 2021-11-29 08:43:03
对我来说,以下代码起作用了:
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;
}https://stackoverflow.com/questions/62073018
复制相似问题