1

在这个问题上被难住了一段时间!

从常规 MVC 项目转移到响应式项目,并且正在使用 Spring Boot(新版本 2.0.0.M3)。

在出现这个特殊问题之前,我对整个图书馆的问题为零。

在使用 WebClient 时,我有一个不起作用的请求。它以前与 RestTemplate 一起工作得很好:

rt.getMessageConverters().add(new MappingJackson2HttpMessageConverter());

HttpHeaders headers = new HttpHeaders();
headers.add("Content-Type", "application/json");
headers.add("Authorization", "Basic REDACTED");

HttpEntity<OtherApiRequest> entity = 
new HttpEntity<OtherApiRequest>(CrawlRequestBuilder.buildCrawlRequest(req), headers);

ResponseEntity<Void> response = rt.postForEntity("https://other_api/path", 
    entity, 
    Void.class);

System.out.println(response.getStatusCode());

我的 WebClient 代码:

client
  .post()
  .uri("https://other_api/path")
  .header("Authorization", "Basic REDACTED")
  .contentType(MediaType.APPLICATION_JSON)
  .body(Mono.just(req), OtherApiRequest.class)
  .exchange()
  .then(res -> System.out.println(res.getStatusCode()));

我也尝试过先生成身体:

ObjectMapper mapper = new ObjectMapper();
String body = mapper.writeValueAsString(
client
  .post()
  .uri("https://other_api/path")
  .header("Authorization", "Basic REDACTED")
  .contentType(MediaType.APPLICATION_JSON)
  .body(body, String.class)
  .exchange()
  .then(res -> System.out.println(res.getStatusCode()));

这里有什么明显的错误吗?我看不出两者之间有任何问题会导致第二个失败......

编辑: RestTemplate 提供 204 的响应。 WebClient 提供 400 的响应,表示正文是无效的 JSON。使用上面 WebClient 的第二个示例,我可以打印body变量并查看它是正确的 JSON。

Edit2:我正在序列化的 POJO 类:

@JsonNaming(PropertyNamingStrategy.SnakeCaseStrategy.class)
public class OtherApiRequest {
    private String app;
    private String urllist;
    private int maxDepth;
    private int maxUrls;

   public OtherApiRequest(String app, String urllist, int maxDepth, int maxUrls) {
        this.app = app;
        this.urllist = urllist;
        this.maxDepth = maxDepth;
        this.maxUrls = maxUrls;
    }

   public String getApp() {
        return app;
    }

   public String getUrllist() {
        return urllist;
    }

   public int getMaxDepth() {
        return maxDepth;
    }

   public int getMaxUrls() {
        return maxUrls;
    }

   public String toString() {
        return "OtherApiRequest: {" +
            "app: " + app + "," +
            "urllist: " + urllist + "," +
            "max_depth: " + maxDepth + "," +
            "max_urls: " + maxUrls +
            "}";
    }
}
4

1 回答 1

0

编辑:

在这里查看更好的答案

缺少使用 WebClient 发送 POST 请求的 Content-Length 标头(SpringBoot 2.0.2.RELEASE)

错误报告

https://github.com/spring-projects/spring-framework/issues/21085

在 2.2 中修复

当我遇到“无效的 JSON 响应”时,我通过 netcat 查看了 WebClient 请求,发现实际有效负载(在此示例3.16中包含在某种内容信息中):

$ netcat -l 6500
PUT /value HTTP/1.1
user-agent: ReactorNetty/0.7.5.RELEASE
transfer-encoding: chunked
host: localhost:6500
accept-encoding: gzip
Content-Type: application/json

4
3.16
0

在我添加contentLength()到构建器之后,前面的 4 和后面的 0 消失了。

于 2020-07-14T08:51:30.500 回答