2
votes

Objet JSON POST via RestTemplate dans Spring Boot

J'essaie de POSTER un objet JSON sur un point de terminaison d'API qui accepte les données au format ci-dessous

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

Et ma méthode de publication est comme ci-dessous

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);
}


3 commentaires

tu veux essayer de cette façon? ou pourquoi n'utilisez-vous pas la classe POJO?


Je l'ai essayé aussi, j'ai eu une erreur 404.


Alors c'est un problème de code, pouvez-vous ajouter plus d'informations, quel type de demande de demande et de réponse? et qu'est-ce qui travaille exactement pour le facteur?


4 Réponses :


0
votes

Créez un objet JSONArray en utilisant names puis définissez le tableau json dans jsonObject.put ("names", jsonArrayObject);


0 commentaires

-1
votes

Vous n'avez pas besoin de faire tout cela, je suppose que

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

}

Peut être facilement fait en utilisant POJO

créez un POJO,

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

créez votre méthode de publication où vous passez l'objet exact comme dans pojo

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);


0 commentaires

0
votes

reportez-vous à baeldung.com, exemple de modèle de repos . Vous pouvez utiliser HttpEntity, T pas JSONObject mais de type POJO, LIKE:

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

HttEntity is Représente une requête HTTP ou une entité de réponse, composée d'en-têtes et de corps. Généralement utilisé en combinaison avec RestTemplate


0 commentaires

2
votes

La raison pour laquelle publier le JsonObject directement via un RestTemplate ne fonctionne pas dans votre cas est que le RestTemplate utilise Jackson Serializer - pas la méthode toString. Le sérialiseur récupérera la structure interne de la classe et la transformera en une représentation json, alors que la méthode toString () vous donne les données json que vous attendez.

Dans votre cas, la représentation interne une fois sérialisée ressemblera à ceci:

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

Ce n'est pas la structure que vous attendiez, mais c'est en partie la façon dont JsonObject stocke votre structure json en interne. (capture des informations de type, etc.).

Cependant, lorsque vous appelez toString (), le JsonObject vous donne ce que vous attendiez (c'est-à-dire une représentation json sans toutes les métadonnées).

Bref, ce que vous pensez envoyer et ce que vous envoyez réellement sont différents. L'erreur 400 que vous rencontrez est probablement due au fait que le point de terminaison que vous appelez rejette le format réel des données.

Vous pouvez voir cela par vous-même en déboguant l'appel réel effectué par le RestTemplate à l'aide d'un intercepteur. Vous pouvez également demander à votre client d'appeler un service d'écho pour voir la charge utile.


0 commentaires