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
がよしなにやってくれる