0%

SpringBoot-RestTemplate

文章字数:448,阅读全文大约需要1分钟

RestTemplate是spring提供的访问Rest服务的客户端,默认使用jdk的http连接工具(HttpURLConnection)。可以通过setRequestFactory属性切换到其它http源, Apache HttpComponentsNettyOkHttp等。

一、入口

入口方法主要根据HTP的六个方法制定的:

HTTP method RestTempalte methods
GET getForObject
- getForENtity
POST poetForLocation
- postForObject
DELETE delete
PUT put
HEAD headForHeaders
OPTIONS optionsForAllow
通用方法 exchange
- execute

注:默认使用HttpMessageConverter实例完成POJPHTTP的转换,也可以通过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工具解析成pojoResponseEntityHttpStatus getStatusCode()BodyBuildercreated(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();
//第一个参数url
String url = "http://xxx.com/test";
//第二个参数request(val,header)
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType);
//一个key对应多个val的map
MultiValueMap<String, String> map= new LinkedMultiValueMap<>();
map.add("name", "zhangsan");
//request
HttpEntity<MultiValueMap<String,String>> request = new HttpEntity<>(map,headers);
//执行 url,http主
ResponseEntity<String> response = restTemplate.postForEntity(url,request,String.class);
//返回值{"status":500,"msg":"xxx","data":null}
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,//请求类型(HttpMethod.POST/PUT/DELETE/GET)
HttpEntity requestEntity, //请求主体:请求体、头、内容
Class responseType, //返回实体类
Object uriVariables[]//url参数
)

设置超时

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
/**
* 获取request
*
* @param params
* @return
*/
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);
}

/**
* 通过url发送post请求
*
* @param url
* @param param
* @return
*/
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");
}


/**
* 通过url发送get请求
*
* @param url
* @return
*/
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});

// 使用byte[]上传
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});