복붙노트

[SPRING] RestTemplate GET 응답이 XML에 있어야 할 때 JSON에 있어야하는 이유는 무엇입니까?

SPRING

RestTemplate GET 응답이 XML에 있어야 할 때 JSON에 있어야하는 이유는 무엇입니까?

나는 성공없이 RestTemplate (org.springframework.web.client.RestTemplate)을 사용하여 매우 유연한 스프링 동작으로 고생했습니다.

코드 아래에있는 구멍 애플리케이션에서 사용하고 항상 XML 응답을받습니다. XML 응답을 파싱하고 평가합니다.

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

하지만 서버 응답이 JSON 형식으로 된 이유는 다음과 같습니다.

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

낮은 수준의 RestTemplate에서 디버깅을했는데 컨텐츠 유형이 XML이지만 왜 결과가 JSON인지 알 수 없습니다.

브라우저에서 액세스 할 때 응답은 XML에도 있지만 apiResponse에서 JSON을 얻었습니다.

Spring documentation을 읽은 후에 많은 옵션을 시도했다. 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);
                }
            }
        }

아이디어를 줄 수 있습니까?

해결법

  1. ==============================

    1.나는 RC의 도움으로 내 문제를 해결할 수 있었다. 나는 다른 사람들을 돕기 위해 답을 게시 할 것이다.

    나는 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();
    
  2. from https://stackoverflow.com/questions/21613416/why-resttemplate-get-response-is-in-json-when-should-be-in-xml by cc-by-sa and MIT license