RestTemplateでつまったことが多いからまとめてみた

表題のとおりだが、RestTemplateでつまることが多かったため自分用にまとめてみた。
内容はシンプル。InvokerControllerがInvokeeControllerを呼び出すだけ。

PATCHメソッドはHttpComponentsClientHttpRequestFactoryを使用する。

サンプル

呼び出し元

@RestController
public class InvokerController {
    private static final String URL_INVOKEE = "http://localhost:8080/invokee";
    
    @GetMapping(path = "/get")
    public ResponseEntity<String> get() {
        RestTemplate template = new RestTemplate();
        return template.getForEntity(URL_INVOKEE,String.class);
    }
    
    @GetMapping(path = "/post")
    public ResponseEntity<String> post() {
        SampleRequest request = new SampleRequest();
        MultiValueMap<String, Object> bodyMap = new LinkedMultiValueMap<>();
        
        request.setId("id");
        bodyMap.add("id", request);

        HttpHeaders headers = new HttpHeaders();
        headers.setContentType(MediaType.APPLICATION_JSON);
        HttpEntity<MultiValueMap<String, Object>> requestEntity = new HttpEntity<>(bodyMap, headers);
        
        RestTemplate template = new RestTemplate();
        return template.exchange(URL_INVOKEE, HttpMethod.POST, requestEntity, String.class);
    }
    
    @GetMapping(path = "/patch")
    public  ResponseEntity<String> test005() throws IOException {
        SampleRequest request = new SampleRequest();
        MultiValueMap<String, Object> bodyMap = new LinkedMultiValueMap<>();
        
        request.setId("id");
        bodyMap.add("id", request);

        HttpHeaders headers = new HttpHeaders();
        headers.setContentType(MediaType.APPLICATION_JSON);
        HttpEntity<MultiValueMap<String, Object>> requestEntity = new HttpEntity<>(bodyMap, headers);

        RestTemplate template = new RestTemplate();
        
        // patchメソッド用。RestTemplateを書き換える。
        HttpComponentsClientHttpRequestFactory requestFactory =
                new HttpComponentsClientHttpRequestFactory();
        
        template.setRequestFactory(requestFactory);

        return template.exchange(URL_INVOKEE, HttpMethod.PATCH, requestEntity, String.class);
    }
}

呼び出し先

@RestController
public class InvokeeController {

    @GetMapping(path = "/invokee")
    public String get() {
        return "Getメソッド";
    }
    
    @PostMapping(path = "/invokee")
    public String post(@ModelAttribute SampleRequest req) {
        return "Postメソッド";
    }
    
    @PatchMapping(path = "/invokee")
    public String patch(@ModelAttribute SampleRequest req) {
        return "Patchメソッド";
    }
}

GitLab

gitlab.com