2016-07-09 4 views
1

헤더가있는 GET 요청을 보내야합니다 : Content-Type: application/camiant-msr-v2.0+xml. 나는 서버로부터 XML 응답을 기대한다. 나는 우편 배달부와 요청 및 응답을 테스트하고 모든 것이 좋습니다. 그러나 봄에 RestTemplate으로하려고하면 항상 400 개의 잘못된 요청을받습니다. spring에서 예외는 다음과 같습니다맞춤 헤더로 Resttemplate GET 요청

Jul 09, 2016 12:53:38 PM org.apache.catalina.core.StandardWrapperValve invoke 
SEVERE: Servlet.service() for servlet [dispatcherServlet] in context with path [/smp] threw exception [Request processing failed; nested exception is org.springframework.web.client.HttpClientErrorException: 400 Bad Request] with root cause 
org.springframework.web.client.HttpClientErrorException: 400 Bad Request 
    at org.springframework.web.client.DefaultResponseErrorHandler.handleError(DefaultResponseErrorHandler.java:91) 
    at org.springframework.web.client.RestTemplate.handleResponse(RestTemplate.java:641) 
    at org.springframework.web.client.RestTemplate.doExecute(RestTemplate.java:597) 
    at org.springframework.web.client.RestTemplate.execute(RestTemplate.java:557) 
    at org.springframework.web.client.RestTemplate.exchange(RestTemplate.java:475) 

내 코드 :

MultiValueMap<String, String> headers = new LinkedMultiValueMap<String, String>(); 
headers.add("Content-Type", "application/camiant-msr-v2.0+xml"); 

HttpEntity<?> entity = new HttpEntity<Object>(headers); 
log.debug("request headers: " + entity.getHeaders()); 
ResponseEntity<String> response = restTemplate.exchange(queryUrl, HttpMethod.GET, entity, String.class); 

디버그 메시지가 올 것으로 보인다 {Content-Type=[application/camiant-msr-v2.0+xml]}로 헤더를 보여줍니다. 내 요청에 어떤 문제가 있는지, 디버깅 할 수있는 요청을 볼 수있는 방법이 있는지 궁금합니다.

+1

GET을 보내는 경우 왜 'Content-Type' 헤더를 제공합니까? 대신에 '수락'을 원하십니까? –

+0

@ nicholas.hauschild 서버는 헤더를 제공함으로써 만 XML 응답을 얻을 수 있다고 기대하기 때문에. –

+0

@ nicholas.hauschild 나는 당신이 무슨 뜻인지 좀 이해하지만, API 스펙에 의하면, 또한 Postman이 잘 작동한다고 나와있다. –

답변

0

실제로 전달할 헤더는 GET 메소드이므로 Content-Type이 아닌 Accept으로 지정해야합니다. 그러나 서버 API doc은 어떻게 든 Content-Type을 요구하며 명령 행/Postman의 API는 Content-TypeAccept 모두에서 잘 작동한다고합니다. 나는 Content-Type 헤더가 GET 요청으로 전달되는 것을 막는 자바 라이브러리라고 생각한다.

1

400의 가능한 해석은 요청에 허용되지 않는 콘텐츠 유형이거나 URL이 일치하지 않는다는 것입니다.

내 개인적인 경험에서 나는 당신이 queryUrl을 엉망으로 만든다는 강한 느낌을 가지고 있습니다. 그래서 여기에서 좋은 것들을 조정하려면 스프링의 UriComponentsBuilder 클래스를 사용하는 것이 좋습니다.

UriComponentsBuilder builder = UriComponentsBuilder.fromHttpUrl(url) 
     .queryParam("data", data); 

HttpEntity<?> entity = new HttpEntity<>(headers); 

HttpEntity<String> response = restTemplate.exchange(
     builder.build().encode().toUri(), 
     HttpMethod.GET, 
     entity, 
     String.class); 

그래도 작동하지 않는다면 알려 주시기 바랍니다.

+0

답장을 보내 주셔서 감사합니다. 하지만 난 여전히 당신의 방법으로 나쁜 요청 오류가 발생합니다. URL을 인쇄했는데 우편 배달부에서 사용한 것과 정확히 동일합니다. –