Pourquoi RestTemplate OBTENIR de réponse en JSON quand doit-être en XML?
J'ai lutté avec un extrange printemps comportement à l'aide de RestTemplate (org.springframework.web.client.RestTemplate) sans succès.
- Je utiliser dans mon trou de demande de code ci-dessous et recevez toujours une réponse XML, qui, je l'analyser et d'évaluer ses résultats.
String apiResponse = getRestTemplate().postForObject(url, body, String.class);
Mais ne peut 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é au niveau de l'RestTemplate et le type de contenu est du XML, mais n'ai aucune idée pourquoi le résultat est en JSON.
Quand j'ai accès à partir d'un navigateur, la réponse est aussi dans le XML, mais dans apiResponse j'ai eu JSON.
J'ai essayé plusieurs options après la lecture de Printemps de la documentation
http://docs.spring.io/spring/docs/3.0.x/api/org/springframework/web/client/RestTemplate.html
Également essayé de modifier explicitement les en-têtes, mais ne peut toujours pas comprendre.
J'ai débogué RestTemplate classe et a remarqué que cette méthode est toujours d'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?
RestTemplate
est de bas niveau et il suffit de faire une base, OBTENIRRC est juste, besoin de regarder les en-têtes de requête de contenu et les types de réponses à ce chiffre. Veuillez fournir plus de contexte pour votre problème.
J'ai juste mis à jour le post avec de nouvelles informations. Semble que le allSupportedMediaTypes est toujours avec application/json. Si la modifier via le débogueur d'application/xml, il fonctionne. Pourquoi se produit-il? Au fait, comment puis-je faire pour utiliser l'application/xml par défaut?
la isse arrive parce que "allSupportedTypes" contient l'application/json et il est ajouté à setAccept. J'ai besoin de comprendre pourquoi json est définie et comment le changer. Merci beaucoup
voir cette réponse
OriginalL'auteur Federico Piazza | 2014-02-06
Vous devez vous connecter pour publier un commentaire.
J'ai pu résoudre mon problème avec le RC. s'aider. Je vais poster la réponse à l'aide d'autres personnes.
Le problème était que d'Accepter d'en-tête est automatiquement défini sur APPLICATION/JSON, donc j'ai dû changer la façon d'appeler le service dans le but de fournir de l'en-tête Accept je veux.
J'ai changé cela:
Pour cela, dans le but de faire la demande de travail:
excellent, heureux de l'entendre. Merci pour le +1
Pour moi, cela ne fonctionne pas à cause de mon type de contenu application/json;UTF-8. Ne pouvait pas extrait de la réponse: aucun adapté HttpMessageConverter trouvé pour le type de réponse ...classname... et le type de contenu [application/json;charset=UTF-8]
OriginalL'auteur Federico Piazza