web-dev-qa-db-fra.com

Pourquoi la réponse RestTemplate GET est en JSON alors qu'elle devrait être en XML?

J'ai eu du mal avec un comportement de ressort extrange en utilisant RestTemplate (org.springframework.web.client.RestTemplate) sans succès.

J'utilise dans mon application de trou ci-dessous le code et reçois toujours une réponse XML, que j'analyse et évalue son résultat.

String apiResponse = getRestTemplate().postForObject(url, body, String.class);

Mais je ne peux pas comprendre pourquoi une réponse du serveur est au format JSON après l'exécution:

String apiResponse = getRestTemplate().getForObject(url, String.class);

J'ai débogué à RestTemplate de bas niveau et le type de contenu est XML, mais je n'ai aucune idée pourquoi le résultat est en JSON.

Lorsque j'accède à partir d'un navigateur, la réponse est également en XML, mais dans apiResponse, j'ai obtenu JSON.

J'ai essayé de nombreuses options après avoir lu la documentation de Spring http://docs.spring.io/spring/docs/3.0.x/api/org/springframework/web/client/RestTemplate.html

A également essayé de modifier explicitement les en-têtes mais ne peut toujours pas le comprendre.

J'ai débogué la classe RestTemplate et j'ai remarqué que cette méthode définit toujours application/json:

public void doWithRequest(ClientHttpRequest request) throws IOException {
            if (responseType != null) {
                List<MediaType> allSupportedMediaTypes = new ArrayList<MediaType>();
                for (HttpMessageConverter<?> messageConverter : getMessageConverters()) {
                    if (messageConverter.canRead(responseType, null)) {
                        List<MediaType> supportedMediaTypes = messageConverter.getSupportedMediaTypes();
                        for (MediaType supportedMediaType : supportedMediaTypes) {
                            if (supportedMediaType.getCharSet() != null) {
                                supportedMediaType =
                                        new MediaType(supportedMediaType.getType(), supportedMediaType.getSubtype());
                            }
                            allSupportedMediaTypes.add(supportedMediaType);
                        }
                    }
                }
                if (!allSupportedMediaTypes.isEmpty()) {
                    MediaType.sortBySpecificity(allSupportedMediaTypes);
                    if (logger.isDebugEnabled()) {
                        logger.debug("Setting request Accept header to " + allSupportedMediaTypes);
                    }
                    request.getHeaders().setAccept(allSupportedMediaTypes);
                }
            }
        }

Pourriez-vous nous donner une idée?

11
Federico Piazza

Je pourrais résoudre mon problème avec l'aide de RC. Je posterai la réponse pour aider d'autres personnes.

Le problème était que l'en-tête Accept est automatiquement défini sur APPLICATION/JSON, j'ai donc dû changer la façon d'appeler le service afin de fournir l'en-tête Accept que je veux.

J'ai changé ça:

String response = getRestTemplate().getForObject(url, String.class);

Pour cela afin de faire fonctionner l'application:

// Set XML content type explicitly to force response in XML (If not spring gets response in JSON)
HttpHeaders headers = new HttpHeaders();
headers.setAccept(Arrays.asList(MediaType.APPLICATION_XML));
HttpEntity<String> entity = new HttpEntity<String>("parameters", headers);

ResponseEntity<String> response = getRestTemplate().exchange(url, HttpMethod.GET, entity, String.class);
String responseBody = response.getBody();
17
Federico Piazza