在Spring Boot中通过RestTemplate通过POST JSON对象

时间:2019-01-27 00:01:33

标签: java json spring-boot post resttemplate

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

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

我的发布方法如下

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,并尝试通过邮递员将其发布,并且有效。

我在这里想念的是什么?

任何帮助将不胜感激。

4 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

我想你不必做所有这一切

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
}

答案 2 :(得分:0)

请参阅baeldung.com,rest-template sample。您可以使用HttpEntity,不是JSONObject,而是POJO类型,例如:

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

HttEntity is表示HTTP请求或响应实体,由标头和正文组成。 通常与RestTemplate

结合使用

答案 3 :(得分:0)

在您的情况下,直接通过RestTemplate发布JsonObject不起作用的原因是RestTemplate使用的是Jackson序列化器-而不是toString方法。序列化程序将获取类的内部结构,并将其转换为json表示形式,因为toString()方法为您提供了所需的json数据。

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

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

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

但是,当您调用toString()时,JsonObject会给您您所期望的内容(即不包含所有元数据的json表示形式)。

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

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