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); }
4 Réponses :
Créez un objet JSONArray
en utilisant names
puis définissez le tableau json dans jsonObject.put ("names", jsonArrayObject);
p>
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);
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
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.
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?