SpringのRestit Templata使用の具体的な方法
6735 ワード
基本概念
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です。タイムアウト時間は自分で定義できます。
POST要求を使う:
deleteタイプの要求を使用するなら、Restit Templateのputメソッドのパラメータ列は以下の通りです。
重点:実は私達は直接にRertTemplateのexchangeの方法を使うことができます。
この方法では、methodパラメータはHTTPMethodエニュメレーションで取得できます。request Entityパラメータは自分のカプセル化したHttpEntityエンティティです。要求体と要求ヘッドを含んでいます。レスポンスTypeパラメータはリターン結果のマッピング類です。uriVarabelesというパラメータは私の印象です。取得要求のリターンインターフェースは、方法により値のget Body()を返して取得することができる。
以上が本文の全部です。皆さんの勉強に役に立つように、私たちを応援してください。
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インターフェースは主に二つの実施形態を提供しています。
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()を返して取得することができる。
以上が本文の全部です。皆さんの勉強に役に立つように、私たちを応援してください。