我正在尝试发送带有正文数据的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();
这是我尝试做的,但是给了我HTTP代码500
最有可能是因为您以错误的格式和错误的类型混合发送了错误的数据:
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
的相当基本的基本部分。我建议您更广泛地阅读以使自己对基本原理有更好的了解,从长远来看,这将极大地帮助您。