SpringBoot-RestTemplate

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

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

HTTP method RestTempalte methods

注:默认使用 HttpMessageConverter 实例完成 POJP HTTP 的转换,也可以通过 setMessageConverters 注册其它的转换器。( @ResponseBody 使用的也是 HttpMessageConverter

二、GET

getForObject() getForEntity() 解析类写String.class获取的就是字符串形式的数据

getForObject()方法

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()方法实例

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()方法

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

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

public enum HttpStatus {
public boolean is1xxInformational() {}
public boolean is2xxSuccessful() {}
public boolean is3xxRedirection() {}
public boolean is4xxClientError() {}
public boolean is5xxServerError() {}
public boolean isError() {}

BodyBuilder.java

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()方法实例:

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方法

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 {}
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

json : application/json
xml : application/xml
png : image/png
jpg : image/jpeg
gif : imge/gif

excute()和exchange()

excute()返回映射对象<T>,exchange()返回ResponseEntity<T>

restTemplate.exchange(
         String url, //地址
         HttpMethod method,//请求类型(HttpMethod.POST/PUT/DELETE/GET)
         HttpEntity requestEntity, //请求主体:请求体、头、内容
         Class responseType, //返回实体类
         Object uriVariables[]//url参数