RestTemplate(org.springframework.web.client.RestTemplate)を使用して、異常なスプリング動作に苦労しましたが、成功しませんでした。
私はコードの下の自分のホールアプリケーションで使用し、常にXML応答を受け取ります。これを解析して結果を評価します。
String apiResponse = getRestTemplate().postForObject(url, body, String.class);
しかし、実行後にサーバー応答がJSON形式である理由を理解できません。
String apiResponse = getRestTemplate().getForObject(url, String.class);
低レベルのRestTemplateでデバッグしましたが、コンテンツタイプはXMLですが、結果がJSONである理由がわかりません。
ブラウザからアクセスした場合の応答もXMLですが、apiResponseではJSONを取得しました。
Springのドキュメントを読んだ後、多くのオプションを試しました http://docs.spring.io/spring/docs/3.0.x/api/org/springframework/web/client/RestTemplate.html
また、ヘッダーを明示的に変更しようとしましたが、まだそれを理解できません。
RestTemplateクラスをデバッグし、このメソッドが常に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);
}
}
}
アイデアを頂けますか?
RC。の助けを借りて問題を解決できました。他の人を助けるために答えを投稿します。
問題は、AcceptヘッダーがAPPLICATION/JSONに自動的に設定されるため、必要なAcceptヘッダーを提供するために、サービスを呼び出す方法を変更する必要があったことです。
私はこれを変更しました:
String response = getRestTemplate().getForObject(url, String.class);
これを行うには、アプリケーションを機能させる必要があります。
// 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();