SpringのRestit Templata使用の具体的な方法


基本概念
Spring Restit TemplateはSpringが提供するResetサービスにアクセスするためのクライアントであり、RestTemplateはリモートHttpサービスに便利にアクセスするための様々な方法を提供しており、クライアントの作成効率を大幅に向上させることができます。
spring-webのRestit Templataはjavaの下のhttpのパッケージであり、RestTemplataを使用するユーザは、下の接続確立にもう関心を持たなくてもいいし、Rest TemplataはRest仕様だけでなく、リターンオブジェクトタイプを定義することもできる。
使用中に直接newのRestTemplateオブジェクトがあります。私達が作成したRestTemplateオブジェクトの中にはいくつかのリターンメッセージのメッセージ変換器があります。リターンデータのMediaTypeによって対応する変換器を探してMediaType変換を行うことができます。自分でもメッセージ変換器を作成して、AbstractGeneracHttp Message Coverter<T>類を継承したり、Http Message Coverter<T>インターフェースを実現したりします。注意すべきのはcanRead方法とcanWrite方法は自分で判断して、writeInternalまたはwrite方法でパラメータをストリームに書き込みます。readInternalまたはread方法では、リターン結果がストリームのbodyから取得され、タイプマッピングされる。
Reset Templateオブジェクトは、java.netパッケージを使用してHTTP要求を作成することにより、ClientHttpRequest Factoryを使用して異なるHTTP要求方式を指定することができます。
ClientHttpRequest Factoryインターフェースは主に二つの実施形態を提供しています。
  • はSimpleClient HttpRequest Factoryであり、J 2 SEが提供する方式(java.netパッケージが提供する方式)を使って下の階のHttpを作成して接続を要求する。
  • は、HttpComponents Client HttpRequest Factory方式を使用して、最下層はHttpClientを使ってリモートのHttpサービスにアクセスし、Http Clientを使って接続池や証明書などの情報を配置することができる。
  • Restit TemplateデフォルトはSimpleClient HttpRequest Factoryを使用しています。内部はjdkのHttpConnectionを呼び出しています。デフォルトのタイムアウトは-1です。タイムアウト時間は自分で定義できます。
    
    SimpleClientHttpRequestFactory factory = new SimpleClientHttpRequestFactory();
    //      ,    
    factory.setConnectTimeout(5000);
    //      ,    
    factory.setReadTimeout(10000);
    RestTemplate restTemplate = new RestTemplate(factory);
    GET要求を使う:
    
    String url = "http://localhost:80/mandy/login.json?account=123456&password=123456";
    Result res = restTemplate.getForObject(url, Result.class);
    RertTemplateソース:
    
      @Override
     public <T> T getForObject(String url, Class<T> responseType, Object... urlVariables) throws RestClientException {
      RequestCallback requestCallback = acceptHeaderRequestCallback(responseType);
      HttpMessageConverterExtractor<T> responseExtractor =
        new HttpMessageConverterExtractor<T>(responseType, getMessageConverters(), logger);
      return execute(url, HttpMethod.GET, requestCallback, responseExtractor, urlVariables);
     }
    get要求を使って直接にパラメータを住所につなぎ合わせるのが一番いいです。理由が分かりません。第三のパラメータを使うとMultiValueMapタイプでもだめです。
    POST要求を使う:
    
    HashMap<String, Object> map = new HashMap<String, Object>();
     map.put("name", "  ");
     map.put("account", "qwer");
     map.put("password", "qwer");
     ObjectMapper mapper = new ObjectMapper();
     String jsonStr = null;
     try {
       jsonStr = mapper.writeValueAsString(map);
     } catch (Exception e) {
       e.printStackTrace();
     }
    //  HTTP    ,      ,      
     HttpHeaders httpHeaders = new HttpHeaders();
     httpHeaders.setContentType(MediaType.APPLICATION_JSON_UTF8);
    //  HTTP  ,                     
     HttpEntity<String> httpEntity = new HttpEntity<String>(jsonStr2, httpHeaders);
    String url = "http://localhost:80/mandy/user_enable.json";
    //        
     Result res2 = restTemplate.postForObject(url, httpEntity, Result.class);
    
    
    RertTemplateソース:
    
      @Override
     public <T> T postForObject(String url, Object request, Class<T> responseType, Object... uriVariables)
       throws RestClientException {
    
      RequestCallback requestCallback = httpEntityCallback(request, responseType);
      HttpMessageConverterExtractor<T> responseExtractor =
        new HttpMessageConverterExtractor<T>(responseType, getMessageConverters(), logger);
      return execute(url, HttpMethod.POST, requestCallback, responseExtractor, uriVariables);
     }
    
    PUT要求を使う:
    
    HashMap<String, Object> map = new HashMap<String, Object>();
    map.put("user_id", "1");
    map.put("enable", 0);
    ObjectMapper mapper = new ObjectMapper();
    String jsonStr = null;
    try {
     jsonStr = mapper.writeValueAsString(map);
    } catch (JsonProcessingException e) {
     e.printStackTrace();
    }
    //  HTTP    ,      ,      
    HttpHeaders httpHeaders = new HttpHeaders();
    httpHeaders.setContentType(MediaType.APPLICATION_JSON_UTF8);
    //  HTTP  ,                     
    HttpEntity<String> httpEntity = new HttpEntity<String>(jsonStr, httpHeaders);  
    String url = "http://localhost:80/mandy/user_enable.json";
    restTemplate.put(url , httpEntity);
    
    RertTemplateソース:
    
      @Override
     public void put(String url, Object request, Object... urlVariables) throws RestClientException {
      RequestCallback requestCallback = httpEntityCallback(request);
      execute(url, HttpMethod.PUT, requestCallback, null, urlVariables);
     }
    この方法には小さな欠点があります。結果の戻り値を要求しないことです。戻り値を使う必要があるなら、この方法は使えません。
    deleteタイプの要求を使用するなら、Restit Templateのputメソッドのパラメータ列は以下の通りです。
    
    @Override
    public void delete(String url, Object... urlVariables) throws RestClientException {
      execute(url, HttpMethod.DELETE, null, null, urlVariables);
    }
    
    @Override
    public void delete(String url, Map<String, ?> urlVariables) throws RestClientException {
      execute(url, HttpMethod.DELETE, null, null, urlVariables);
    }
    
    @Override
    public void delete(URI url) throws RestClientException {
      execute(url, HttpMethod.DELETE, null, null);
    }
    
    
    これらの方法は要求体の内容をパラメータで教えてくれませんので、RestTemplateで提供されるDelete方法を直接使うには、インターフェースはretsfulスタイルを使用して、パラメータを住所に置いてください。@PathVarable("value=")注解でパラメータを取得します。
    重点:実は私達は直接にRertTemplateのexchangeの方法を使うことができます。
    
    @Override
    public <T> ResponseEntity<T> exchange(String url, HttpMethod method,
      HttpEntity<?> requestEntity, Class<T> responseType, Object... uriVariables) throws RestClientException {
    
      RequestCallback requestCallback = httpEntityCallback(requestEntity, responseType);
      ResponseExtractor<ResponseEntity<T>> responseExtractor = responseEntityExtractor(responseType);
      return execute(url, method, requestCallback, responseExtractor, uriVariables);
    }
    
    
    ここでは一つの方法を挙げました。他のソースコードを見てもいいです。この方法はすべての種類の要求ができます。
    この方法では、methodパラメータはHTTPMethodエニュメレーションで取得できます。request Entityパラメータは自分のカプセル化したHttpEntityエンティティです。要求体と要求ヘッドを含んでいます。レスポンスTypeパラメータはリターン結果のマッピング類です。uriVarabelesというパラメータは私の印象です。取得要求のリターンインターフェースは、方法により値のget Body()を返して取得することができる。
    以上が本文の全部です。皆さんの勉強に役に立つように、私たちを応援してください。