在 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?