1. ホーム

[解決済み] Spring RestTemplateでフォームデータをPOSTする方法は?

2022-04-11 09:50:33

質問

私は、次の(作業)curlスニペットをRestTemplate呼び出しに変換したい。

curl -i -X POST -d "[email protected]" https://app.example.com/hr/email

emailパラメータを正しく渡すにはどうしたらよいですか?以下のコードでは、404 Not Foundというレスポンスが返されます。

String url = "https://app.example.com/hr/email";

Map<String, String> params = new HashMap<String, String>();
params.put("email", "[email protected]");

RestTemplate restTemplate = new RestTemplate();
ResponseEntity<String> response = restTemplate.postForEntity( url, params, String.class );

PostManで正しい呼び出しを定式化しようとしたところ、emailパラメータをbody内の"form-data"パラメータとして指定することで正しく動作させることができました。RestTemplateでこの機能を実現するには、どのような方法が正しいのでしょうか?

解決方法は?

POSTメソッドは、HTTPリクエストオブジェクトに沿って送信する必要があります。また、リクエストには、HTTPヘッダーとHTTPボディのどちらか、または両方が含まれます。

そこで、HTTPエンティティを作成し、ヘッダとボディにパラメータを送信してみましょう。

HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED);

MultiValueMap<String, String> map= new LinkedMultiValueMap<String, String>();
map.add("email", "[email protected]");

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

ResponseEntity<String> response = restTemplate.postForEntity( url, request , String.class );

http://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/web/client/RestTemplate.html#postForObject-java.lang.String-java.lang.Object-java.lang.Class-java.lang.Object...-