没有请求正文的对象的 Spring Boot RestClient 发布导致错误请求

Posted

技术标签:

【中文标题】没有请求正文的对象的 Spring Boot RestClient 发布导致错误请求【英文标题】:Spring boot RestClient post for object without request body results in bad request 【发布时间】:2020-06-09 02:12:49 【问题描述】:

我正在尝试制作一个没有请求正文的 restTemplate.postForObject(),但我收到了错误的请求。

HttpHeaders headers = new HttpHeaders();
      headers.set(HttpHeaders.AUTHORIZATION, "Bearer " + accessToken);
      headers.setAccept(Collections.singletonList(MediaType.APPLICATION_JSON));
      HttpEntity<String> entity = new HttpEntity<>(headers);

      CurrentAccount account = client.postForObject(
          "https://api.dropboxapi.com/2/users/get_current_account", entity, CurrentAccount.class);

错误

Caused by: org.springframework.web.client.HttpClientErrorException$BadRequest: 400 Bad Request: [Error in call to API function "users/get_current_account": Bad HTTP "Content-Type" header: "application/x-www-form-urlencoded".  Expecting one of "application/json", "application/json; charset=utf-8", "text/plain; charset=dropbox-cors-hack".]

关于添加

 headers.setContentType(MediaType.APPLICATION_JSON);

我收到一个错误

Caused by: org.springframework.web.client.HttpClientErrorException$BadRequest: 400 Bad Request: [Error in call to API function "users/get_current_account": request body: could not decode input as JSON]

邮递员请求在没有正文的情况下工作

【问题讨论】:

【参考方案1】:

错误消息是不言自明的。你已经设置了Accept,但是你没有设置Content-Type

在标题中添加以下内容

import org.springframework.http.MediaType;

...

headers.setContentType(MediaType.APPLICATION_JSON);

【讨论】:

在添加时我得到一个错误原因:org.springframework.web.client.HttpClientErrorException$BadRequest:400 错误请求:[调用 API 函数“users/get_current_account”时出错:请求正文:可以不将输入解码为 JSON]【参考方案2】:

您还应该将请求正文指定为字符串文本“null”。是的,Dropbox Api 声明在发出 POST 请求时不需要发送正文,但在 Dropbox 如何期望空 JSON 正文表示与 Spring Rest 模板如何在 POST 请求中发送空正文 JSON 表示之间存在错误

【讨论】:

【参考方案3】:

您可以将 org.json.JSONObject 用作​​空请求正文:

restTemplate.postForEntity(
            "http://<yoururl>.com",
            new org.json.JSONObject(), <YourResponseType>.class).getBody();

特别是如果您希望路由返回某些内容,在这种情况下“null”请求正文将不起作用。

【讨论】:

以上是关于没有请求正文的对象的 Spring Boot RestClient 发布导致错误请求的主要内容,如果未能解决你的问题,请参考以下文章

如何在 spring-boot Web 客户端中发送请求正文?

从请求正文 Spring Boot 中删除空属性

有没有办法让 Spring Boot 反序列化以反序列化测试中的对象?

Spring Boot RestController - PostMapping - 将请求正文作为 InputStream [重复]

请求正文中的 Spring Boot Keycloak 客户端凭据

如何在请求正文 Spring Boot Rest Controller 中指定订单验证