Springboot 基础9 -- SpringBoot 调用接口 RestTemplate 实现

RestTemplate 实现及状态码说明

介绍

RestTemplate 简化了与http 服务的通信方式,统一了RESTful 的标准,封装了http 链接。,我们只需传入 url 和获取返回值类型即可。类似于之前的 HttpClient。

RestTemplate 是spring 框架中自带的rest 客户端工具类,具有丰富的API , 并且在springcloud 中,标记@LocalBalanced 注解,可以实现客户端负载均衡的rest 调用。

RestTemplate 是从3.0 开始支持的一个Http 请求工具,它提供了常见的REST 请求方案模板,如:GET 请求、POST请求、DELETE 请求和Put 请求,以及一些通用的请求的执行方法,exchange 以及 execute。

RestTemplate 继承自InterceptingHttpAccessor 并实现了RestOperation 接口,其中RestOperations 接口定义了基本的RESTful 操作,这些操作在RestTemplate 中都进行了实现。

Get 请求

getForEntity(String, Class<T>, Map<String, ?>)
getForEntity(String, Class<T>, Object)
getForEntity(URL, Class<T>)

getForEntity 来发送HTTP请求,此时返回的对象是一个ResponseEntiry 实例,这个实例中包含响应数据以及响应头。

getForObject(String, Class<T>, Map<String, ?>)
getForObject(String, Class<T>, Object)
getForObject(URL, Class<T>)

getForObject 方法与getForEntity 方法类似,getForObject 返回的结果就是服务提供者返回的数据,使用getForObject 无法实现获取响应头。

Post 请求

与 Get 请求相比,RestTemplate 中的Post 请求多了一个类型方法。

postForEntity(String, Object, Class<T>, Map<String, ?>)
postForEntity(String, Object, Class<T>, Object...)
postForEntity(URL, Object, Class<T>)

postForEntity, post 请求方式可以是key/value的形式,也可以JSON 形式。

传递key/value形式

传递json 形式数据

RestTemplate 是spring 框架自带的工具类。因此不需要专门在 pom.xml 中引入依赖。

postForObject() 和 postForEntity 方式基本一致,返回类型为服务器提供返回数据,postForLocation 方法的返回值是一个url 对象。

主要实现7个主要的Http 请求方法:

 

Http methodRestTemplate methods
DELETEdelete
HEADheadForHeaders
OPTIONSoptionsForAllow
PUTput
GETgetForObject, getForEntity
POSTpostForObject, postForEntity
anyexchange, execute

实现配置类

利用spring 管理RESTTemplate 实例,

@Configureation
public class RestTemplateConfig{
  
  @Bean
  public RestTemplate  restTemplate(){
    return new RestTemplate(httpRequestFactory);
  }
  
  public ClientHttpRequestFactory httpRequestFactory(){
    return new HttpComponentdClientHttpRequestFactory(httpClient())
  }
  
  public HttpClient httpClient(){
    Registry<ConnectionSocketFactory> registry = RegistryBuilder
      .<ConnectionSocketFactory>create()
      .register("http",PlainConnnectionSocketFactory.getSocketFactory())
      .register("https",SSLConnnectionSocketFactory.getSocketFactory())
      .build();
    
    PoolingHttpClientConnectionManager connectionManager = new PoolingHttpClientConnectionManager(registry);
    // 设置整个连接池最大连接数
    connectionManager.setMaxTotal(100);
    // 路由完成对maxTotal 细分
    connectionManager.setDefaultMaxPerRout(100);
    RequestConfig requestConfig = RequestConfig.custom()
      // 服务器返回数据(response)de 时间,超出改时间将抛出 read timeout
      .setSocketTimeout(10000)
      // 连接上服务器(握手成功)的时间
      .setConnectTimeout(5000)
      // 从连接池中获取连接的超时时间,超过该时间未拿到可以用的连接
      // 会抛出org.apache.http.conn.ConnectionPollTimeoutException: Timeout wating for connection from pool
      .setConnectionRequsetTimeout(1000)
      .build();
    
    return HttpClinetBuilder.create()
      .setDefaultRequestConfig(requestConfig)
      .setConnectionManager(connectionManger)
      .build();
  }
}

通过以上实现对Springboot 服务远程接口调用的配置。

接下里实现调用代码的实现:

@Autowired
private RestTemplate restTemplate;
​
public String PostUtil(JSONObject jsonObjectData) {
​
        // 加载  post 请求
        String url = "http://localhost:8080/dataAnalysis/t";
​
        long startTime = System.currentTimeMillis(); //获取开始时间
​
        // 访问请求外部url, restTemplate 类似于 httpClient
        ResponseEntity<String> responseEntity = restTemplate.postForEntity(url, jsonObjectData, String.class);
​
        long endTime = System.currentTimeMillis(); //获取结束时间
​
        System.out.println("程序运行时间:" + (endTime - startTime) + "ms"); //输出程序运行时间
​
        
        // 返回请求结果集
        System.out.println(responseEntity.getBody());
​
​
        return responseEntity.getBody();
    }
其中,url 为远程服务地址,HttpMethod.Post 为POST 方法, jsonObjectData 为传入远程服务的参数, resultInfo 为返回的结果集。

 

Http 状态码

状态码说明
200响应成功
320跳转,跳转地址通过响应头中的location属性指定(JSP 中Forward和Redirect之间区别)
400客户端请求语法错误,不能被服务器识别
403服务器接收请求,但是拒绝提供服务(认证失败)
404请求资源不存在
500服务器内部错误

HTTP 状态码分类

分类分类描述
1**信息,服务器收到请求,需要请求者继续执行操作
2**成功,操作被成功接收并处理
3**重定向,需要进一步操作及完成请求
4**客户端错误,请求包含语法错误或无法完成请求
5**服务器错误,服务器在处理请求的过程中,发生了错误

版权声明:本文为it_lxg123原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。