文章字数:448,阅读全文大约需要1分钟
RestTemplate
是spring提供的访问Rest服务的客户端,默认使用jdk的http连接工具(HttpURLConnection)。可以通过setRequestFactory
属性切换到其它http源, Apache
HttpComponents
、Netty
、OkHttp
等。
一、入口 入口方法主要根据HTP的六个方法制定的:
HTTP method
RestTempalte methods
GET
getForObject
-
getForENtity
POST
poetForLocation
-
postForObject
DELETE
delete
PUT
put
HEAD
headForHeaders
OPTIONS
optionsForAllow
通用方法
exchange
-
execute
注:默认使用HttpMessageConverter
实例完成POJP
和HTTP
的转换,也可以通过setMessageConverters
注册其它的转换器。(@ResponseBody
使用的也是HttpMessageConverter
)
二、GET
getForObject()
和getForEntity()
解析类写String.class获取的就是字符串形式的数据
getForObject()方法 1 2 3 public <T> T getForObject(String url, Class<T> responseType, Object... uriVariables){} public <T> T getForObject(String url, Class<T> responseType, Map<String, ?> uriVariables) public <T> T getForObject(URI url, Class<T> responseType)
注:getForObject()比getForEntity()多了HTTP
转换成POJO
,但是省略了response
信息。
getForObject()方法实例 1 2 3 4 5 6 7 8 9 10 11 12 13 public void restTemplateGetTest(){ RestTemplate restTemplate = new RestTemplate(); //无参 MessObj messObj1 = restTemplate.getForObject("http://xxx.com/test",MessObj .class); //占位符传参 MessObj messObj2 = restTemplate.getForObject("http://xxx.com/test/{1}/{2}",MessObj .class,"参数1","参数2"); //map传参 Map<String,String> map = new HashMap(); map.put("id","1"); map.put("name","zs") MessObj messObj1 = restTemplate.getForObject("http://xxx.com/test",MessObj .class,map); //结果:messObj{status=200,data=[{a=1}...]...} }
getForEntity()方法 1 2 3 public <T> ResponseEntity<T> getForEntity(String url, Class<T> responseType, Object... uriVariables){} public <T> ResponseEntity<T> getForEntity(String url, Class<T> responseType, Map<String, ?> uriVariables){} public <T> ResponseEntity<T> getForEntity(URI url, Class<T> responseType){}
注:返回的是ResponseEntity
对象,需要json
工具解析成pojo
。ResponseEntity
有HttpStatus getStatusCode()
、BodyBuilder
、created(URI location)
等方法,方便查看更多信息。
ResponseEntity.java
1 2 3 4 5 6 7 8 public HttpStatus getStatusCode(){} public int getStatusCodeValue(){} public boolean equals(@Nullable Object other) {} public String toString() {} public static BodyBuilder status(HttpStatus status) {} public static BodyBuilder ok() {} public static <T> ResponseEntity<T> ok(T body) {} public static BodyBuilder created(URI location) {}
HttpStatus.java
1 2 3 4 5 6 7 8 public enum HttpStatus { public boolean is1xxInformational() {} public boolean is2xxSuccessful() {} public boolean is3xxRedirection() {} public boolean is4xxClientError() {} public boolean is5xxServerError() {} public boolean isError() {} }
BodyBuilder.java
1 2 3 4 5 6 7 8 public interface BodyBuilder extends HeadersBuilder<BodyBuilder> { //设置正文的长度,以字节为单位,由Content-Length标头 BodyBuilder contentLength(long contentLength); //设置body的MediaType 类型 BodyBuilder contentType(MediaType contentType); //设置响应实体(ResponseEntity)的主体(内容)并返回它。 <T> ResponseEntity<T> body(@Nullable T body); }
getForEntity()方法实例:
1 2 3 4 5 6 7 public void gettTest(){ RestTemplate resTemplate = new RestTemplate(); ResponseEntity<MessObj> entity = restTemplate.getForEntity("http://xx.com/test",MessObj.class); HttpStatus hsc = entity.getStatusCode(); MessObj msObj = entity.getBody(); ResponseEntity.BodyBuilder status = ResponseEntity.status(hsc); }
三、POST
postForObject()
和postForEntity()
postForObject方法 1 2 3 4 5 public <T> T postForObject(String url, @Nullable Object request, Class<T> responseType, Object... uriVariables) throws RestClientException {} public <T> T postForObject(String url, @Nullable Object request, Class<T> responseType, Map<String, ?> uriVariables) throws RestClientException {} public <T> T postForObject(URI url, @Nullable Object request, Class<T> responseType) throws RestClientException {}
实例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 public void postTest () { RestTemplate restTemplate = new RestTemplate(); String url = "http://xxx.com/test" ; HttpHeaders headers = new HttpHeaders(); headers.setContentType(MediaType); MultiValueMap<String, String> map= new LinkedMultiValueMap<>(); map.add("name" , "zhangsan" ); HttpEntity<MultiValueMap<String,String>> request = new HttpEntity<>(map,headers); ResponseEntity<String> response = restTemplate.postForEntity(url,request,String.class ) ; System.out.println(response.getBody()); }
头类型 MediaType
1 2 3 4 5 json : application/json xml : application/xml png : image/png jpg : image/jpeg gif : imge/gif
excute()和exchange() excute()
返回映射对象<T>
,exchange()
返回ResponseEntity<T>
1 2 3 4 5 6 7 restTemplate.exchange( String url, HttpMethod method, HttpEntity requestEntity, Class responseType, Object uriVariables[] )
设置超时 1 2 3 4 SimpleClientHttpRequestFactory clientHttpRequestFactory = new SimpleClientHttpRequestFactory(); clientHttpRequestFactory.setConnectTimeout(5 * 1000 ); clientHttpRequestFactory.setReadTimeout(5 * 1000 ); RestTemplate rest = new RestTemplate(clientHttpRequestFactory);
封装工具 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 private HttpEntity<MultiValueMap<Object, Object>> getRequestByParam(Object[]... params) { final HttpHeaders headers = new HttpHeaders(); final LinkedMultiValueMap<Object, Object> map = new LinkedMultiValueMap<>(); if (params != null ) { for (Object[] param : params) { map.add(param[0 ], param[1 ]); } } headers.setContentType(MediaType.MULTIPART_FORM_DATA); return new HttpEntity<>(map, headers); } private String postFromUrl (String url, Object[]... param) { final HttpEntity<MultiValueMap<Object, Object>> request = getRequestByParam(param); final ResponseEntity<String> entity = restTemplate.postForEntity(url, request, String.class ) ; if (entity.getStatusCode().is2xxSuccessful()) { return entity.getBody(); } throw new RuntimeException("conn error" ); } private String getFromUrl (String url) { final ResponseEntity<String> entity = restTemplate.getForEntity(url, String.class ) ; if (entity.getStatusCode().is2xxSuccessful()) { return entity.getBody(); } throw new RuntimeException("conn error" ); }
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 File image = new File("f://xx.jpg" ); FileSystemResource file = new FileSystemResource(image); String res = postFromUrl("http://xx.xx.xx" , new Object[] {"name" , "xx.jpg" }, new Object[] {"image" , file}); final ByteArrayResource file = new ByteArrayResource(image) { @Override public String getFilename () { return "xx.jpg" ; } }; String res = postFromUrl("http://xx.xx.xx" , new Object[] {"name" , "xx.jpg" }, new Object[] {"image" , file});