SpringBootで「application/x-www-form-urlencoded」形式のリクエストを送る&受け取る

application/x-www-form-urlencoded形式でリクエストを送る&受け取る実装でちょっとつまずいたのでメモとして残しておきます。

ひらべー
ひらべー

一言でまとめるなら「MultiValueMap使おうね」

サンプルコード

@RequestMapping(path = "/api")
@RestController
public class ApiTrialController {
    private final RestTemplate restTemplate;

    public ApiTrialController(RestTemplateBuilder restTemplateBuilder) {
        this.restTemplate = restTemplateBuilder.build();
    }

    // 送る側
    @GetMapping("/")
    public Object test() {
        MultiValueMap<String,String> map = new LinkedMultiValueMap<>();
        map.add("key", "value");

        RequestEntity request = RequestEntity.post(URI.create("http://localhost:8080/api/dummy"))
                .contentType(MediaType.APPLICATION_FORM_URLENCODED)
                .accept(MediaType.APPLICATION_FORM_URLENCODED)
                .body(map);

        return restTemplate.exchange(request, String.class).getBody();
    }

    // 受け取る側
    @RequestMapping("/dummy")
    public Object dummy(
            @RequestBody MultiValueMap<String,String> request
    ) {
        return request;
    }
}

実装ポイント

送る側(RestTemplate)

  • bodyに指定するクラスはMultiValueMap<String, ?>
    • application/jsonに慣れていて、任意のオブジェクトでイケると思ってた。。。
  • Content-TypeにはMediaType.APPLICATION_FORM_URLENCODEDを指定する
    • これを指定するとFormHttpMessageConverterがよしなにやってくれる

受け取る側(Controller)

  • 引数に@RequestBodyを付与
  • 型はMultiValueMap<String, ?>
  • あとはFormHttpMessageConverterがよしなにやってくれる

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です