我正在尝试将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
,并尝试通过邮递员将其发布,并且有效。
我在这里想念的是什么?
任何帮助将不胜感激。
答案 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进行的实际调用来亲自查看。或者,让您的客户致电回显服务以查看有效负载。