在 Spring Boot 中通过 RestTemplate POST JSON 对象

Posted

技术标签:

【中文标题】在 Spring Boot 中通过 RestTemplate POST JSON 对象【英文标题】:POST JSON Object via RestTemplate in Spring Boot 【发布时间】:2019-06-20 09:22:33 【问题描述】:

我正在尝试将 JSON 对象发布到接受以下格式数据的 API 端点


    "names": [
        "name1",
        "name2",
        "name3"
    ]

我的post方法如下

public String post(List<String> names) 

    HttpHeaders headers = new HttpHeaders();
    headers.setContentType(MediaType.APPLICATION_JSON);

    JSONObject jsonObject = new JSONObject();
    jsonObject .put("names", names);

    HttpEntity<JSONObject> entity = new HttpEntity<>(jsonObject , headers);

    return restTemplate.postForObject(Constants.URL, entity, String.class);

当我调用 post 方法时出现此错误

org.springframework.web.client.HttpClientErrorException$BadRequest: 400 Bad Request

我打印了jsonObject 并尝试通过 Postman 发布它,它成功了。

我在这里缺少什么?

任何帮助将不胜感激。

【问题讨论】:

你想试试这种方式吗?或者你为什么不使用 POJO 类? 我也试过了,出现404错误。 那是代码问题,你能补充更多信息,请求和响应的请求类型是什么?邮递员到底有什么用? 【参考方案1】:

使用names创建JSONArray对象,然后在jsonObject.put("names", jsonArrayObject);中设置json数组

【讨论】:

【参考方案2】:

我猜你不需要做这一切

public String post(List<String> names) 

HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_JSON);

JSONObject jsonObject = new JSONObject();
jsonObject .put("names", names);

HttpEntity<JSONObject> entity = new HttpEntity<>(jsonObject , headers);

return restTemplate.postForObject(Constants.URL, entity, String.class);

使用 POJO 可以轻松完成

创建一个 POJO,

   @Entity
    class Name
   @JsonProperty
    private String name1;
    getter(); setter();

创建你的 post 方法,你可以像在 pojo 中那样传递确切的对象

@PostMapping("/RESTENDPOINT")
public String post(@RequestBody Name name) 
    return repository.save(name); // your logic

【讨论】:

【参考方案3】:

参考baeldung.com,rest-template sample。可以使用HttpEntity,T不是JSONObject而是POJO类型,LIKE:

HttpEntity<Foo> request = new HttpEntity<>(new Foo("bar"));
ReturnType result = restTemplate.postForObject(fooResourceUrl, request, ReturnType.class);

HttEntity is 表示一个 HTTP 请求或响应实体,由 headers 和 body 组成。 通常与RestTemplate结合使用

【讨论】:

【参考方案4】:

在您的情况下,直接通过 RestTemplate 发布 JsonObject 不起作用的原因是 RestTemplate 使用的是 Jackson Serializer - 而不是 toString 方法。 Serializer 将获取类的内部结构并将其转换为 json 表示,其中 toString() 方法为您提供您期望的 json 数据。

在您的情况下,序列化时的内部表示将如下所示:

"names":"chars":"namesstring","string":"namesstring","valueType":"STRING"

这不是您期望的结构,但它部分是 JsonObject 在内部存储您的 json 结构的方式。 (捕获类型信息等)。

但是,当您调用 toString() 时,JsonObject 会为您提供您所期望的(即没有所有元数据的 json 表示)。

因此,简而言之,您认为自己发送的内容与实际发送的内容是不同的。您遇到的 400 错误可能是因为您调用的端点拒绝了数据的实际格式。

您可以通过使用拦截器调试 RestTemplate 进行的实际调用来亲自了解这一点。或者,让您的客户端调用回显服务以查看有效负载。

【讨论】:

以上是关于在 Spring Boot 中通过 RestTemplate POST JSON 对象的主要内容,如果未能解决你的问题,请参考以下文章

在 Spring Boot 中通过 RestTemplate POST JSON 对象

在 Spring Boot 中通过 RESTful Web 服务生成 JSON?

spring_boot 中通过PageHelper分页

在 Spring Boot 2、Hibernate、PostgreSQL 中通过 JDBC 语句执行 DDL 时出错

Spring Boot中通过CORS解决跨域问题

Spring Boot教程10——多线程