143 votes

Demande POST via RestTemplate en JSON

Je n'ai pas trouvé d'exemple pour résoudre mon problème, alors je veux vous demander de l'aide. Je ne peux pas envoyer une requête POST en utilisant l'objet RestTemplate en JSON.

Chaque fois que j'ai :

org.springframework.web.client.HttpClientErrorException : 415 Unsupported Media Type

J'utilise RestTemplate de cette façon :

...
restTemplate = new RestTemplate();
List<HttpMessageConverter<?>> list = new ArrayList<HttpMessageConverter<?>>();
list.add(new MappingJacksonHttpMessageConverter());
restTemplate.setMessageConverters(list);
...
Payment payment= new Payment("Aa4bhs");
Payment res = restTemplate.postForObject("http://localhost:8080/aurest/rest/payment", payment, Payment.class);

Quelle est ma faute ?

1 votes

@troyfolger l'url n'est plus valide

0 votes

Merci - ce lien fonctionne au moment où nous écrivons ces lignes : spring.io/guides/gs/consuming-rest

1 votes

Pour répondre au problème spécifique du PO, ci-dessus, il vous manque probablement un en-tête HTTP avec le type de contenu approprié, voir la réponse de morganw09dev ci-dessous.

180voto

Cette technique a fonctionné pour moi :

HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_JSON);

HttpEntity<String> entity = new HttpEntity<String>(requestJson, headers);
ResponseEntity<String> response = restTemplate.put(url, entity);

J'espère que cela vous aidera.

115voto

Morgan Kenyon Points 2134

J'ai rencontré ce problème en essayant de déboguer un point de terminaison REST. Voici un exemple de base utilisant la classe RestTemplate de Spring pour faire une requête POST que j'ai utilisé. Il m'a fallu pas mal de temps pour rassembler du code provenant de différents endroits afin d'obtenir une version fonctionnelle.

RestTemplate restTemplate = new RestTemplate();

String url = "endpoint url";
String requestJson = "{\"queriedQuestion\":\"Is there pain in your hand?\"}";
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_JSON);

HttpEntity<String> entity = new HttpEntity<String>(requestJson,headers);
String answer = restTemplate.postForObject(url, entity, String.class);
System.out.println(answer);

L'analyseur JSON particulier que mon point de repos utilisait nécessitait des guillemets doubles autour des noms de champs, c'est pourquoi j'ai échappé les guillemets doubles dans ma chaîne requestJson.

0 votes

Pouvez-vous m'aider sur ce point ? stackoverflow.com/questions/42240927/

1 votes

Spring peut-il utiliser les convertisseurs de messages pour convertir automatiquement l'objet Java en json comme il l'a fait dans Restful API avec RestTemplate ?

1 votes

Le réglage du type de média sur APPLICATION_JSON est la clé pour résoudre le problème.

102voto

Mikael Lepistö Points 1040

J'ai utilisé un modèle de repos avec des JSONObjects comme suit :

// create request body
JSONObject request = new JSONObject();
request.put("username", name);
request.put("password", password);

// set headers
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_JSON);
HttpEntity<String> entity = new HttpEntity<String>(request.toString(), headers);

// send request and parse result
ResponseEntity<String> loginResponse = restTemplate
  .exchange(urlString, HttpMethod.POST, entity, String.class);
if (loginResponse.getStatusCode() == HttpStatus.OK) {
  JSONObject userJson = new JSONObject(loginResponse.getBody());
} else if (loginResponse.getStatusCode() == HttpStatus.UNAUTHORIZED) {
  // nono... bad credentials
}

0 votes

Merci - la méthode JSONObject toString m'a été utile, elle m'a permis d'obtenir un JSONString précis.

1 votes

Comment développer le code ci-dessus pour cela : curl -vvv -X POST " localhost:8080/SillyService_SRC/oauth/ " ?

0 votes

@Mikael Lepistö Comment puis-je récupérer ces paramètres à partir de json du côté du serveur ?

14voto

Raghuram Points 26896

Comme spécifié aquí Je suppose que vous devez ajouter un messageConverter pour MappingJacksonHttpMessageConverter

14voto

Yakhoob Points 239

Je le fais de cette façon et ça marche.

HttpHeaders headers = createHttpHeaders(map);
public HttpHeaders createHttpHeaders(Map<String, String> map)
{   
    HttpHeaders headers = new HttpHeaders();
    headers.setContentType(MediaType.APPLICATION_JSON);
    for (Entry<String, String> entry : map.entrySet()) {
        headers.add(entry.getKey(),entry.getValue());
    }
    return headers;
}

// Passez les en-têtes ici

 String requestJson = "{ // Construct your JSON here }";
logger.info("Request JSON ="+requestJson);
HttpEntity<String> entity = new HttpEntity<String>(requestJson, headers);
ResponseEntity<String> response = restTemplate.exchange(url, HttpMethod.POST, entity, String.class);
logger.info("Result - status ("+ response.getStatusCode() + ") has body: " + response.hasBody());
logger.info("Response ="+response.getBody());

J'espère que cela vous aidera

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X