API設計三

14314 ワード

1 RestTemplateの作成


プロジェクトでは通常、プロジェクトが開始されるとSpringコンテナにRestTemplateのbeanを作成し、必要に応じて直接注入すればいいです.
@Configuration
public class RestTemplateConfig {
 
    @Value("${restTemplate.connectionRequestTimeout}")
    private int connectionRequestTimeout; // 
 
    @Value("${restTemplate.connectionTimeout}")
    private int connectionTimeout;        // 
 
    @Value("${restTemplate.readTimeout}")
    private int readTimeout;              // 
 
    @Bean
    @Primary
    public RestTemplate customRestTemplate(){
        HttpComponentsClientHttpRequestFactory httpRequestFactory = new HttpComponentsClientHttpRequestFactory();
        httpRequestFactory.setConnectionRequestTimeout(connectionRequestTimeout);
        httpRequestFactory.setConnectTimeout(connectionTimeout);
        httpRequestFactory.setReadTimeout(readTimeout);
        return new RestTemplate(httpRequestFactory);
    }
 
}

ここでは、プロファイルに適切な構成パラメータを追加する必要があります.
restTemplate.connectionRequestTimeout = 300000
restTemplate.connectionTimeout = 300000
restTemplate.readTimeout = 300000

2 RestTemplate使用


2.1 RestTemplateのget要求


(1) public T getForObject(String url, Class responseType, Map uriVariables)
 throws RestClientException

パラメータの意味:
  • url:urlアドレス
  • responseType:レスポンスエンティティタイプ.
  • uriVariables:urlアドレスパラメータurlパラメータurlパラメータがない場合は直接Map(new HashMap()を空にします.例:
  •     @Test
        public void testGetForObject_one(){
            String url = HOST +"/api-demo/user";
            Map paramMap = new HashMap<>();
            paramMap.put("name","rose");
            paramMap.put("age",22);
            User user = restTemplate.getForObject(url+"?name={name}&age={age}",User.class,paramMap);
            logger.debug("user:"+user);
        }
    

    (2)public T getForObject(String url,Class responseType,Object...uriVariables)throws RestClientExceptionパラメータの意味:
  • url:urlアドレス
  • responseType:レスポンスエンティティタイプ.
  • uriVariables:urlアドレスパラメータurlアドレスにパラメータがない場合、このパラメータは記入しなくてもいいです.例:
  •     @Test
        public void testGetForObject_two(){
            String url = HOST +"/api-demo/user";
            Object[] arr = new Object[]{"rose", 22};
     
            // URL 
            User user = restTemplate.getForObject(url+"?name={name}&age={age}",User.class,arr);
            logger.debug("user:"+user);
        }
    
    

    (3)public ResponseEntity getForEntity(String url,Class responseType,Map uriVariables)throws RestClientExceptionこの方法は(1)方法の使用と同様であり,この方法の戻り結果がResponseEntityであり,戻り結果から応答状態や応答体などの情報を得ることができる.
    応答体を処理するコードは次のとおりです.
        /**
         *  responseEntity
         * @param responseEntity
         */
        private void disposeResponseEntity(ResponseEntity responseEntity) {
            // code
            int code = responseEntity.getStatusCodeValue();
            logger.debug("httpstatus code:"+code);
     
            // 
            if(code > 1000){
                String errorMessage = String.valueOf(responseEntity.getHeaders().get("Error-Message"));
                logger.debug("Error-Message:"+errorMessage);
            }
     
            // 
            User user = responseEntity.getBody();
            logger.debug("user:"+user);
        }
    

    例:
        @Test
        public void testGetFoEntity_one(){
            String url = HOST +"/api-demo/user";
            Map paramMap = new HashMap<>();
            paramMap.put("name","rose");
            paramMap.put("age",22);
            ResponseEntity responseEntity = restTemplate.getForEntity(url+"?name={name}&age={age}",User.class,paramMap);
            disposeResponseEntity(responseEntity);
        }
    

    (4)public ResponseEntity getForEntity(String url,Class responseType,Object...uriVariables)throws RestClientExceptionこの方法は(2)方法の使用と同様であり,この方法の戻り結果はResponseEntityであり,戻り結果から応答状態や応答体などの情報を得ることができる.例:
        @Test
        public void testGetFoEntity_two(){
            String url = HOST +"/api-demo/user";
            Object[] arr = new Object[]{"rose", -10};
            ResponseEntity responseEntity = restTemplate.getForEntity(url+"?name={name}&age={age}",User.class,arr);
            disposeResponseEntity(responseEntity);
        }
    

    (5)public ResponseEntity getForEntity(URI url,Class responseType)throws RestClientExceptionパラメータの意味:
  • url:urlはURIオブジェクトURI uri=new URI("http://localhost:8080/api/demo?name=zhangsan")、urlパラメータがある場合はアドレスの後ろに接続する必要があります.
  • responseType:レスポンスエンティティタイプ.例:
  •     @Test
        public void testGetFoEntity_three(){
            String url = HOST +"/api-demo/user";
            url = url+"?name=rose&age=22";
            URI uri = null;
            try {
                uri = new URI(url);
            } catch (URISyntaxException e) {
                e.printStackTrace();
            }
            ResponseEntity responseEntity = restTemplate.getForEntity(uri,User.class);
     
            disposeResponseEntity(responseEntity);
        }
    

    2.2 RestTemplateのpost要求


    (1)public T postForObject(String url,@Nullable Object request,Class responseType,Object...uriVariables)throws RestClientExceptionパラメータの意味:
  • url:urlアドレス
  • request:要求エンティティオブジェクト
  • responseType:レスポンスタイプ
  • uriVariables:urlアドレスパラメータurlアドレスにパラメータがない場合、このパラメータは記入せずに使用できます.public T getForObject(String url,Class responseType,Object...uriVariables)と同じです.

  • 同様の方法1:public T postForObject(String url,@Nullable Object request,Class responseType,Map uriVariables)throws RestClientException法は(1)とほぼ同じであり,使用も同様であるが,この方法の最後のurlパラメータの伝達値はMapを用いているため,urlパラメータがない場合は直接Map(new HashMap()を空にする.
    同様の方法2:public T postForObject(URI url,@Nullable Object request,Class responseType)throws RestClientException法と(1)は基本的に同じで、使用も同じで、異なることにこの方法のurlパラメータはURIオブジェクトであり、最後のパラメータはないので、urlにパラメータがある場合はurlの後ろに直接つなぐ必要があります.例:URI uri=new URI("http://localhost:8080/api/demo?name=zhangsan").例:
        @Test
        public void testPostForObject_one(){
            String url = HOST +"/api-demo/json/user?dept={dept}";
            Object[] arr = new Object[]{"finance"};
            int result = restTemplate.postForObject(url,new User("liutao",12,"liutao123"),int.class,arr);
            logger.debug("result:"+result);
        }
    

    (2)public ResponseEntity postForEntity(String url,@Nullable Object request,Class responseType,Object...uriVariables)throws RestClientExceptionパラメータの意味:
  • url:urlアドレス
  • request:要求エンティティオブジェクト
  • responseType:レスポンスタイプ
  • uriVariables:urlアドレスパラメータurlアドレスにパラメータがない場合、このパラメータは記入せずに使用できます.public T postForObject(String url,@Nullable Object request,Class responseType,Object...uriVariables)throws RestClientExceptionと同じです.同様に、urlにパラメータがない場合、最後のパラメータuriVariablesは記入しなくてもよい.

  • 同様の方法1:public ResponseEntity postForEntity(String url,@Nullable Object request,Class responseType,Map uriVariables)throws RestClientException法は(2)とほぼ同じであり,使用も同様であるが,この方法の最後のurlパラメータの伝達値はMapを用いているため,urlパラメータがない場合はそのままMap(new HashMap()を空にする.
    同様の方法2:public ResponseEntity postForEntity(URI url,@Nullable Object request,Class responseType)throws RestClientExceptionは、最初のパラメータをURIに置き換えるだけでよい.たとえば、最初のパラメータは、URI uri=new URI("http://localhost:8080/api/demo");
    例:
        @Test
        public void testPostForEntity(){
            String url = HOST +"/api-demo/json/user?dept={dept}";
            Object[] arr = new Object[]{"finance"};
            ResponseEntity responseEntity = restTemplate.postForEntity(url,new User("liutao",12,
                            "liutao123"),
                    Integer.class,arr);
            logger.debug("responseEntity:"+responseEntity);
        }
    

    (3)プレゼンテーションデータ転送はformフォーム形式で行う
        @Test
        public void testPostForm(){
            String url = HOST +"/api-demo/form/user";
     
            // 
            HttpHeaders headers = new HttpHeaders();
            headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED);
     
            // 
            MultiValueMap params= new LinkedMultiValueMap<>();
            params.add("name", "liutao");
            params.add("age", "12");
            params.add("password", "liutao123");
     
            // 
            HttpEntity> requestEntity = new HttpEntity<>(params,headers);
            ResponseEntity responseEntity = restTemplate.postForEntity(url,requestEntity,Integer.class);
            logger.debug("responseEntity:"+responseEntity);
        }
    
    

    2.3 RestTemplateのput要求


    (1) public void put(String url, @Nullable Object request, Object... uriVariables) throws RestClientException
    パラメータの意味:
  • url:urlアドレス
  • request:要求エンティティオブジェクト
  • uriVariables:urlアドレスパラメータurlアドレスにパラメータがない場合、このパラメータは記入せずに使用できます.public T getForObject(String url,Class responseType,Object...uriVariables)と同じです.RestTemplateの残りの2つのputリクエストメソッドは、前のgetとpostの対応メソッドと同様に使用され、ソースコードを表示し、前のget、postメソッドの対応メソッドを参照して学習使用することができます.注意:ここのputメソッドは応答を取得していませんが、応答を取得するにはどうすればいいですか?それはexchangeメソッドを直接使用してputリクエストを実現するしかありません.

  • 例:
          @Test
        public void testPut(){
            String url = HOST +"/api-demo/user";
            User user = new User("liutao",12,"liutao123");
            restTemplate.put(url,user);
        }
    
    

    2.4 RestTemplateのpatch要求


    (1) public T patchForObject(String url, @Nullable Object request, Class responseType, Object... uriVariables) throws RestClientException
    パラメータの意味:
  • url:urlアドレス
  • request:要求エンティティオブジェクト
  • uriVariables:urlアドレスパラメータurlアドレスにパラメータがない場合、このパラメータは記入せずに使用できます.public T getForObject(String url,Class responseType,Object...uriVariables)と同じです.

  • 同様の方法1:public T patchForObject(String url,@Nullable Object request,Class responseType,Map uriVariables)throws RestClientException法は「プレゼンテーション方法」とほぼ同じであり、この方法の最後のurlパラメータの伝値ではMapが使用されるため、urlパラメータがない場合はMap(new HashMap()を直接空にする.
    同様の方法2:public T patchForObject(URI url,@Nullable Object request,Class responseType)throws RestClientExceptionこの方法は「プレゼンテーション方法」とほぼ同じで、urlとは異なる.たとえば、最初のパラメータは、URI uri=new URI("http://localhost:8080/api/demo");
    例:
        @Test
        public void testPatch(){
            String url = HOST +"/api-demo/user/1212?name={name}";
            Object[] arr = new Object[]{"rose"};
            Integer result = restTemplate.patchForObject(url,null,Integer.class,arr);
            logger.debug("result:"+result);
        }
    
    

    2.5 RestTemplateのDELETEリクエスト


    (1) public void delete(String url, Object... uriVariables)
    パラメータの意味:
  • url:urlアドレス
  • uriVariables:urlアドレスパラメータurlアドレスにパラメータがない場合、このパラメータは記入しなくてもよいが、uriVariablesの伝達とget、postの類似の方法は同じである.
  • RestTemplateの残りの2つのdeleteリクエストメソッドは、前のgetとpostの対応メソッドと同様に使用され、ソースコードと前のget、postメソッドの対応メソッドを表示して学習使用することができます.

  • 注意:ここのdeleteメソッドは応答を取得していませんが、応答を取得するにはどうすればいいですか?では、deleteリクエストを直接exchangeメソッドで実現するしかありません.
    例:
        @Test
        public void testDelete(){
            String url = HOST +"/api-demo/user?name={name}&age={age}";
            Object[] arr = new Object[]{"rose", 10};
            restTemplate.delete(url,arr);
        }
    
    

    2.6 RestTemplateのEXCHANGEリクエスト


    (1) public ResponseEntity exchange(String url, HttpMethod method, @Nullable HttpEntity> requestEntity, Class responseType, Object... uriVariables) throws RestClientException
    パラメータの意味:
    url:urlアドレスmethod:httpリクエストメソッドは、HttpMethod列挙クラスによってrequestEntity:リクエストエンティティを取得し、リクエストヘッダとリクエストボディの情報を含むことができるresponseType:レスポンスタイプuriVariables:urlアドレスパラメータであり、urlアドレスにパラメータがない場合、このパラメータを記入しなくても、このメソッドは戻り結果ResponseEntityからレスポンスステータスコードやレスポンスヘッダやレスポンスボディなどの情報を取得することができる.同様の方法1:public ResponseEntity exchange(String url,HttpMethod,@Nullable HttpEntity>requestEntity,Class responseType,Map uriVariables)throws RestClientException法は(1)とほぼ同じであり、使用も同様であるが、異なるのはこの方法の最後のurlパラメータの伝値がMapであるため、urlパラメータがない場合はMap(new HashMap()を直接空にする.同様の方法2:public ResponseEntity exchange(URI url,HttpMethod,@Nullable HttpEntity>requestEntity,Class responseType)throws RestClientExceptionメソッドは(1)とほぼ同じであり、使用も同様であるが、このメソッドのurlパラメータはURIオブジェクトであり、最後のパラメータがないため、urlにパラメータがある場合はurlの後ろに直接つなぐ必要がある.例:URI uri=new URI("http://localhost:8080/api/demo?name=zhangsan")
    例:
    @Test
    public void testExchange_one(){
    
        // 
        MultiValueMap headers = new LinkedMultiValueMap();
        headers.add("Accept","application/json");
        headers.add("Content-Type","application/json");
    
        // 
        User user = new User("dasf",12,"liutao123");
        HttpEntity requestEntity = new HttpEntity(user,headers);
    
        String url = HOST +"/api-demo/user";
        ResponseEntity responseEntity = restTemplate.exchange(url,
                HttpMethod.PUT,requestEntity,Integer.class);
        logger.debug("responseEntity:"+responseEntity);
    }
    

    (2)デモではtoken配置再要求ヘッダをバックグラウンドに渡して検証し,exchangeメソッドでget要求をコミットし,パラメータでrequestHeadersを指定して要求ヘッダパラメータを設定する
    例:
    @Test
    public void howToSendToken(){
        String url = HOST +"/api-demo/finance/user?name={name}";
        Map paramMap = new HashMap<>();
        paramMap.put("name","rose");
        // 
        HttpHeaders requestHeaders = new HttpHeaders();
        requestHeaders.set("token",UUID.randomUUID().toString());
        HttpEntity requestEntity = new HttpEntity<>(null, requestHeaders);
        ResponseEntity responseEntity = restTemplate.exchange(url,
                HttpMethod.GET,requestEntity,User.class,paramMap);
        logger.debug(responseEntity.getBody().toString());
    }
    

    作者:ONROAD 0612出典:CSDN原文:https://blog.csdn.net/ONROAD0612/article/details/82258193本文は博主のオリジナルの文章で、転載して博文のリンクを添付してください!