web-dev-qa-db-ja.com

Spring RestTemplate POST URLエンコードされたデータでのリクエスト

私はSpringを初めて使用し、RestTemplateで残りの要求をしようとしています。 Javaコードは、以下のcurlコマンドと同じようにする必要があります。

curl --data "name=feature&color=#5843AD" --header "PRIVATE-TOKEN: xyz" "https://someserver.com/api/v3/projects/1/labels"

しかし、サーバーは400 Bad RequestでRestTemplateを拒否します

RestTemplate restTemplate = new RestTemplate();
HttpHeaders headers = new HttpHeaders();
headers.add("PRIVATE-TOKEN", "xyz");
HttpEntity<String> entity = new HttpEntity<String>("name=feature&color=#5843AD", headers);
ResponseEntity<LabelCreationResponse> response = restTemplate.exchange("https://someserver.com/api/v3/projects/1/labels", HttpMethod.POST, entity, LabelCreationResponse.class);

誰かが私が間違っていることを教えてもらえますか?

12
Tobi

問題は、サーバーにデータを送信しようとしたときに、「application/json」または「application/x-www-form-urlencoded」の2つのうちの1つであるコンテンツタイプヘッダーを設定しなかったことです。あなたの場合は、サンプルのパラメーター(名前と色)に基づいた「application/x-www-form-urlencoded」です。このヘッダーは、「クライアントがサーバーに送信するデータのタイプ」を意味します。

RestTemplate restTemplate = new RestTemplate();

HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED);
headers.add("PRIVATE-TOKEN", "xyz");

MultiValueMap<String, String> map = new LinkedMultiValueMap<>();
map.add("name","feature");
map.add("color","#5843AD");

HttpEntity<MultiValueMap<String, String>> entity = new HttpEntity<>(map, headers);

ResponseEntity<LabelCreationResponse> response =
    restTemplate.exchange("https://foo/api/v3/projects/1/labels",
                          HttpMethod.POST,
                          entity,
                          LabelCreationResponse.class);
20
Nikolay Rusev

Content-Typeをapplication/jsonに設定する必要があります。 Content-Typeはリクエストで設定する必要があります。以下は、Content-Typeを設定するために変更されたコードです

final String uri = "https://someserver.com/api/v3/projects/1/labels";
String input = "US";
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED);
headers.add("PRIVATE-TOKEN", "xyz");
HttpEntity<String> request = new HttpEntity<String>(input, headers);
ResponseEntity<LabelCreationResponse> response = restTemplate.postForObject(uri, request,  LabelCreationResponse.class);

ここで、HttpEntityは入力(つまり「US」とヘッダー)で構築されます。これが機能するかどうかを教えてください。そうでない場合は、例外を共有してください。乾杯!

3
VijayD

ヘッダーが有効なヘッダーであるかどうかは、ヘッダーの問題チェックである可能性があります。「BasicAuth」ヘッダーを参照していますか?

HttpHeader headers = new HttpHeaders();
    headers.add("Content-Type", MediaType.APPLICATION_FORM_URLENCODED.toString());
    headers.add("Accept", MediaType.APPLICATION_JSON.toString()); //Optional in case server sends back JSON data

    MultiValueMap<String, String> requestBody = new LinkedMultiValueMap<String, String>();
    requestBody.add("name", "feature");
    requestBody.add("color", "#5843AD");

    HttpEntity formEntity = new HttpEntity<MultiValueMap<String, String>>(requestBody, headers);

    ResponseEntity<LabelCreationResponse> response = 
                    restTemplate.exchange("https://example.com/api/request", HttpMethod.POST, 
                                          formEntity, LabelCreationResponse.class);
0
Hades