RestTemplate Get请求

858 阅读1分钟

小知识,大挑战!本文正在参与「程序员必备小知识」创作活动

RestTemplate Get请求

在RestTemplate中,对GET请求可以通过如下两种方法进行调用实现

第一种:getForEntity方法

返回ResponseEntity,对象是Spring对HTTP请求响应的封装,其中主要存储了HTTP的请求状态码、在它的父类HttpEntity中还存储着HTTP请求的头信息对象HttpHeaders以及泛型类型的请求体对象。

public <T> ResponseEntity<T> getForEntity(String url, Class<T> responseType, Object... urlVariables) throws RestClientException {
    RequestCallback requestCallback = this.acceptHeaderRequestCallback(responseType);
    ResponseExtractor<ResponseEntity<T>> responseExtractor = this.responseEntityExtractor(responseType);
    return (ResponseEntity)this.execute(url, HttpMethod.GET, requestCallback, responseExtractor, urlVariables);
}

三个参数,url为请求的地址,responseType为请求响应体body的包装类型,urlVariables为url中的参数绑定。

实例:

restTemplate.getForEntity("http://HELLO-SERVICE/hello1?name={1}", String.class, "didi")

responseType

public <T> ResponseEntity<T> getForEntity(String url, Class<T> responseType, Map<String, ?> urlVariables)
      throws RestClientException {

   RequestCallback requestCallback = acceptHeaderRequestCallback(responseType);
   ResponseExtractor<ResponseEntity<T>> responseExtractor = responseEntityExtractor(responseType);
   return execute(url, HttpMethod.GET, requestCallback, responseExtractor, urlVariables);
}

三个参数,url为请求的地址,responseType为请求响应体body的包装类型,urlVariables使用了Map类型

示例:

Map<String, String> params = new HashMap<>();
params.put("name", "dada");
restTemplate.getForEntity("http://HELLO-SERVICE/hello1?name={name}", String.class, params); 
public <T> ResponseEntity<T> getForEntity(URI url, Class<T> responseType) throws RestClientException {
   RequestCallback requestCallback = acceptHeaderRequestCallback(responseType);
   ResponseExtractor<ResponseEntity<T>> responseExtractor = responseEntityExtractor(responseType);
   return execute(url, HttpMethod.GET, requestCallback, responseExtractor);
}

使用URI对象替代之前url和urlVariables指定访问地址和参数绑定。

UriComponents uriComponents = UriComponentsBuilder.fromUriString(
        "http://HELLO-SERVICE/hello1?name={name}")
        .build()
        .expand("dodo")
        .encode();
URI uri = uriComponents.toUri();
restTemplate.getForEntity(uri, String.class).getBody();

第二种:getForObject方法

对getForEntity的进一步封装,通过HttpMessageConverterExtractor对HTTP的请求响应体body内容进行对象转换,实现请求直接返回包装好的对象内容

当不需要关注请求响应除body之外的内容时,该方法非常好用,可以少一个从Response中获取body的步骤。