2016-07-09 17 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'ヘッダを提供していますか?あなたは代わりにそれを 'Accept'にしますか? –

+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要求に渡されるのを防ぐJavaライブラリだと思います。

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を印刷しました。これはPostmanで使用したものとまったく同じですが、うまくいきました。 –

関連する問題