POST JSON Object через RestTemplate в Spring Boot - PullRequest
0 голосов
/ 27 января 2019

Я пытаюсь отправить объект 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 голосов
/ 29 мая 2019

Причина публикации JsonObject напрямую через RestTemplate не работает в вашем случае, потому что RestTemplate использует Jackson Serializer, а не метод toString.Сериализатор подберет внутреннюю структуру класса и превратит ее в представление json, где в качестве метода toString () вы получите ожидаемые данные json.

В вашем случае внутреннее представление, когдаserialized будет выглядеть примерно так:

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

Это не та структура, которую вы ожидали, а отчасти то, как JsonObject хранит вашу структуру json внутри.(получение информации о типе и т. д.).

Однако, когда вы вызываете toString (), JsonObject дает вам то, что вы ожидали (то есть представление json без всех метаданных).

Короче говоря, вы думаете, что вы отправляете и что вы на самом деле отправляете, отличаются.Ошибка 400 возникает, вероятно, из-за того, что вызываемая вами конечная точка отклоняет фактический формат данных.

Вы можете убедиться в этом сами, отладив фактический вызов RestTemplate с помощью перехватчика.В качестве альтернативы попросите вашего клиента вызвать службу эха, чтобы увидеть полезную нагрузку.

0 голосов
/ 27 января 2019

Вам не нужно делать все это, я думаю,

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
}
0 голосов
/ 05 марта 2019

см. baeldung.com, пример шаблона отдыха . Вы можете использовать HttpEntity, T не JSONObject, а тип POJO, LIKE:

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

HttEntity is Представляет объект HTTP-запроса или ответа, состоящий из заголовков и тела. Обычно используется в сочетании с RestTemplate

0 голосов
/ 27 января 2019

Создайте объект JSONArray, используя names, а затем установите массив json в jsonObject.put("names", jsonArrayObject);

...