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