Spring MVC ResetクライアントRestTemplate詳細

13051 ワード

目次
Rest Template Resetテンプレートの概要
Http GET要求
Http Postリクエスト
Rets Templateタイムアウト時間
OkHttpClientクライアントを切り替えます.
Rest Template Resetテンプレートの概要
負荷バランス(@LoadBalanced)を有するRestit Templateは、マイクロサービス名を使用して要求を開始しなければならず、ip:portを使用して負荷均衡(@LoadBalanced)を持たないRestit Templateは、マイクロサービス名を使用して要求を開始することができず、ip:portのみを使用することができる.
1、org.springframe ewark.web.client.Restit Template類はspring-web-x.x.RELEASE.jarパッケージの下でHTTP訪問を行うRESTクライアントコアクラスです.
2、Javaアプリケーションのバックグラウンドコードの中で、他のJavaアプリケーションにHttp要求を開始する場合、通常はApachのHttpClientライブラリを使用します.一方、spring cloudマイクロサービスアーキテクチャでは、各マイクロサービス間で頻繁にhttp要求を開始して通信するので、springはhttp要求をカプセル化して、より便利に利用できるようにする.
3、Rets Template類は、restスタイルの方式で、GET、POST、PUT、DELETE、HEAD、OPTNSなどの異なる方式でサーバにHTTP要求を開始することができます.
4、ResttTemplateのhttpに対するパッケージはJdbcTemplateのjdbcに対するパッケージと似ています.本文の環境:Java jdk 8+Spring boot 2.1.3(spring 5.1.5).
構造関数
説明
Rest Template()
デフォルトではorg.springframe ework.http.client.SimpleClinthtt Request Factoryクライアントを使用して、下の階にはjdk標準のAPIを使用しています.java.netパッケージのAPI、java.net.HttpURLConctionなどです.
RestTemplate(ClientHttpRequest Factory request Factory)
ClientHttpRequest Factoryインターフェースの実現クラスは、最下層に実現される第三者HTTPクライアントソフトウェアを提供する.OkHttp 3 Client、及びRibbon Clientなどのようです.
Restt Template(List)message Coverters)
HttpMessage Coverterインターフェースの実現対象は、HTTPメッセージとJava POJOの間でデータ変換が可能である.
Spring MVC Rest 客户端 RestTemplate 详解_第1张图片
5、RestTemplateを使うのはとても簡単で、Spring boot、Spring Coudプロジェクトに対して、spring-boot-starter-webコンポーネントの内部はすでに含まれています. spring-web-x.x.x.RELEASE.jarは、RestTemplateのインスタンスをSpring容器で管理し、必要なところで利用すればいいです.
//        (@SpringBootApplication)      ,    @Configuration        
@Bean
public RestTemplate restTemplate() {
	//  RestTemplate      Spring     
	return new RestTemplate();
}
//    RestTemplate   Controller           ,    
@Resource
private RestTemplate restTemplate;
Http GET要求
方法
説明
Reponse Entity get For Entity(URI url,Class reponseType)
要求されたアドレス、レスポンステキスト、応答状態などの情報が含まれています.
Reponse Entity get ForEntity(String url,Class reponse Type,Map uriVarables)
uriVarables:クエリーパラメータの可変値を設定するために、mapのkey値はurlに設定された可変パラメータ値である.
Reponse Entity get ForEntity(String url,ClassレスポンスType,Object…uriVarables)
uriVarables:url経路のパラメータを扱う専用@PathVarable
T get ForObject(URI url,Class reponse Type)
get ForObject方法は、戻り値が直接応答本文であることと違い、応答ヘッダ情報及び応答状態を含まないことである.
T get ForObject(String url,Class reponseType,Map uriVarables)
 
T get ForObject(String url,Class reponseType,Object…uriVarables)
 
get ForEntity(URI url,Class reponseType)
     /**      
     * http://localhost:8080/getInfo?uid=3030&agencyId=20807
     * @param uid
     * @param agencyId
     * @return
     */
    @GetMapping("getInfo")
    public String getInfo(@RequestParam String uid, String agencyId) {
        JSONObject jsonObject = new JSONObject();
        jsonObject.put("code", 200);
        jsonObject.put("uid", uid);
        jsonObject.put("agencyId", agencyId);
        return jsonObject.toString();
    }
//     
@GetMapping("test1")
public String test1() {
	String body = null;
	try {
		URI uri = new URI("http://localhost:8080/getInfo?uid=3030&agencyId=20807");
		ResponseEntity forEntity = restTemplate.getForEntity(uri, String.class);
		//http     ,       200
		int statusCodeValue = forEntity.getStatusCodeValue();
		//http       ,        ,  {"uid":"3030","code":200,"agencyId":"20807"}
		body = forEntity.getBody();
		//http      ,  Content-Type=[text/plain;charset=UTF-8], Content-Length=[44], Date=[Tue, 24 Mar 2020 12:45:43 GMT]}
		HttpHeaders headers = forEntity.getHeaders();
		System.out.println("headers=" + headers + "
statusCodeValue=" + statusCodeValue + "
body=" + body); } catch (URISyntaxException e) { e.printStackTrace(); } return body; }
get ForEntity(String url,Class reponseType,Object...uriVarables)
 /**
 *      
 * http://localhost:8080/getData
 * @param uid
 * @param agencyId
 * @return
 */
@GetMapping("getData/{agencyId}/{uid}")
public List> getData(@PathVariable String uid, @PathVariable String agencyId, String info) {
	List> dataMapList = new ArrayList<>(8);
	Map map = new HashMap<>(8);
	map.put("code", 200);
	map.put("uid", uid);
	map.put("info", info);
	map.put("agencyId", agencyId);
	dataMapList.add(map);
	return dataMapList;
}
//     
@GetMapping("test2")
public List> test2() {
	String uri = "http://localhost:8080/getData/{agency_id}/{u_id}?info=  ";
	//        List   
	ResponseEntity forEntity = restTemplate.getForEntity(uri, List.class, 20792, "999UP000");
	//http     ,       200
	int statusCodeValue = forEntity.getStatusCodeValue();
	//http       ,        ,  {"uid":"3030","code":200,"agencyId":"20807"}
	List> body = forEntity.getBody();
	//http      ,  Content-Type=[text/plain;charset=UTF-8], Content-Length=[44], Date=[Tue, 24 Mar 2020 12:45:43 GMT]}
	HttpHeaders headers = forEntity.getHeaders();
	System.out.println("headers=" + headers + "
statusCodeValue=" + statusCodeValue + "
body=" + body); return body; }
get ForObject(String url,Class reponseType,Map uriVarables)
/**
 *      
 * http://localhost:8080/getMessage
 *
 * @param uid
 * @param agencyId
 * @return
 */
@GetMapping("getMessage")
public JSONObject getMessage(String uid, String agencyId) {
	List> dataMapList = new ArrayList<>(8);
	Map map = new HashMap<>(8);
	JSONObject jsonObject = new JSONObject();
	jsonObject.put("code", 200);
	jsonObject.put("uid", uid);
	jsonObject.put("agencyId", agencyId);
	return jsonObject;
}
//     
@GetMapping("test3")
public JSONObject test3() {
	String uri = "http://localhost:8080/getMessage?uid={uid}&agencyId={agency_id}";
	Map paramMap = new HashMap<>(4);
	paramMap.put("uid", "9998UYT9");
	paramMap.put("agency_id", 20802);
	//getForObject         JSONObject        ,        .
	JSONObject body = restTemplate.getForObject(uri, JSONObject.class, paramMap);

	System.out.println(body);
	return body;
}
Http Postリクエスト
方法
説明
ReponseEntity postForEntity(URI url、@Nullable Object request、ClassレスポンスType)
url:請求の住所.request:要求された本文(body)の内容、つまり相手@Request Bodyパラメータの値は、nullとすることができます.ReponseEntityオブジェクトにはhttpレスポンスヘッダ情報、応答本文、応答状態などの情報が含まれています.
ReponseEntity postForEntity(String url、@Nullable Object request、Class reponseType、Map uriVarables)
uriVarables:クエリーパラメータの可変値を設定するために、mapのkey値はurlに設定された可変パラメータ値である.
ReponseEntity postForEntity(String url、@Nullable Object request、Class reponseType、Object...uriVarables)
uriVarables:url経路のパラメータを扱う専用@PathVarable
T postForObject(URI url、@Nullable Object request、Class reponseType)
get ForObject方法は、戻り値が直接応答本文であることと違い、応答ヘッダ情報及び応答状態を含まないことである.
T postForObject(String url、@Nullable Object request、Class reponseType、Map uriVarables)
 
T postForObject(String url、@Nullable Object request、Class reponseType、Object...uriVarables)
 
postForEntity(String url、@Nullable Object request、Class reponseType、Map uriVarables)
/**     
 * http://localhost:8080/postInfo?uid=44KKP990&agencyId=208071
 *
 * @param uid
 * @param agencyId
 * @return
 */
@PostMapping("postInfo")
public JSONObject postInfo(@RequestParam String uid, String agencyId) {
	JSONObject jsonObject = new JSONObject();
	jsonObject.put("code", 200);
	jsonObject.put("uid", uid);
	jsonObject.put("agencyId", agencyId);
	return jsonObject;
}
//     
@GetMapping("test11")
public JSONObject test11() {
	JSONObject body = null;
	String uri = "http://localhost:8080/postInfo?uid={uid}&agencyId=208071";
	Map paramMap = new HashMap<>(4);
	paramMap.put("uid", "8899HG9");
	ResponseEntity forEntity = restTemplate.postForEntity(uri, null, JSONObject.class, paramMap);
	//http     ,       200
	int statusCodeValue = forEntity.getStatusCodeValue();
	//http       ,        ,  {"uid":"3030","code":200,"agencyId":"20807"}
	body = forEntity.getBody();
	//http      ,  Content-Type=[text/plain;charset=UTF-8], Content-Length=[44], Date=[Tue, 24 Mar 2020 12:45:43 GMT]}
	HttpHeaders headers = forEntity.getHeaders();

	System.out.println("headers=" + headers + "
statusCodeValue=" + statusCodeValue + "
body=" + body); return body; }
postForObject(String url、@Nullable Object request、Class reponseType、Object...uriVarables)
/**
 *      
 * http://localhost:8080/postData/{agencyId}
 */
@PostMapping("postData/{agencyId}")
public List> postData(@PathVariable String agencyId, @RequestBody List ids) {
	List> dataMapList = new ArrayList<>(8);
	Map map = new HashMap<>(8);
	map.put("code", 200);
	map.put("uid", ids.toArray());
	map.put("agencyId", agencyId);
	dataMapList.add(map);
	return dataMapList;
}
//     
@GetMapping("test22")
public List> test22() {
	String uri = "http://localhost:8080/postData/{agencyId}";
	List ids = new ArrayList<>(4);
	ids.add("3000L");
	ids.add("99UH7");
	ids.add("99JHG");
	//        List   
	List> body = restTemplate.postForObject(uri, ids, List.class, 20792);
	return body;
}
//その他の操作は同じです.
Rets Templateタイムアウト時間
1、new Relt Template()の場合はデフォルトではSimpleClient HttpRequest Factory工場を使用しています.その下の階にJava原生のHttpURLConnection APIを使ってHttp要求をしています.デフォルトのconnectTimeout=-1(接続タイムアウト)は、readTimeout=-1(読み取りタイムアウト)は制限されていません.
2、明らかに無期限の待つことは許されません.タイムアウト時間を設定しなければなりません.SimpleClintHttpRequest Factory工場を例にします.
    //   http     ,    RestTemplate      Spring     
    @Bean
    public RestTemplate restTemplate() {
        //    http              30  ,        120  
        //     ,        ,          ,              ,         ,      。
        SimpleClientHttpRequestFactory requestFactory = new SimpleClientHttpRequestFactory();
        requestFactory.setConnectTimeout(30 * 1000);
        requestFactory.setReadTimeout(120 * 1000);
        return new RestTemplate(requestFactory);
    }
3、検証はとても簡単で、youtubeにお願いします.接続できなくてタイムアウトします.そして異常を投げます. java.net.SocketTimeout Exception:Read timed out
Stering body=rect Template.get ForObject("https://ca.youtube.com/「String.class」
OkHttpClientクライアントを切り替えます.
1、ClientHttpRequest Factoryにはいくつかの実現クラスがあり、Khttp 3は現在最も人気のあるhttpクライアントとして、ここではOkHttp Clidentを例にしています.
2、第一歩のプロジェクトにOkHttpClientの依存を導入したら、それ以外は報告されます.java.lang.NoClass DefFoundError:ok http 3/OkHttpClient
        
        
            com.squareup.okhttp3
            okhttp
            3.14.5
        
バージョンは勝手に引くことができません.org.springframewark.http.client.OkHttp 3 ClintHttpRequest Factory類のソースコードの上には通常、対応するOkHttpバージョンが提示されています.本文のspring-web-5.7.RELEASE.jarで提示されたOkHttpバージョンは3.Xで、4.4 Xを導入すれば起動できません.
3、次はRestTemplateの対象を作成する時、OkHttp 3 ClintHttpRequest Factory工場に伝えばいいです.
    //   http     ,    RestTemplate      Spring     
    @Bean
    public RestTemplate restTemplate() {
        //    http              30  ,        120  
        OkHttp3ClientHttpRequestFactory okRequestFactory = new OkHttp3ClientHttpRequestFactory();
        okRequestFactory.setConnectTimeout(30 * 1000);
        okRequestFactory.setReadTimeout(120 * 1000);
        return new RestTemplate(okRequestFactory);
    }
下の階で何を使っているのか確認するのも簡単です.youtubeにお願いします.https://ca.youtube.com)超常時制御層を接続すると印刷が異常になります.  okhttp 3.internal.xxxxのエラー情報.
4、その他は  ApacheのHttpClient、およびNetty、Ribron Clientなどのhttpクライアントは同じです.
Ribbonの負荷バランスは、RestTemplateに @LoadBalancedを加え、Netflix Ribronの負荷バランスを参照することができます.
拡張内容は引き続き参照できます.https://blog.csdn.net/f641385712/article/details/100713622