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 method | RestTemplate methods |
|---|---|
| DELETE | delete |
| HEAD | headForHeaders |
| OPTIONS | optionsForAllow |
| PUT | put |
| GET | getForObject, getForEntity |
| POST | postForObject, postForEntity |
| any | exchange, 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** | 服务器错误,服务器在处理请求的过程中,发生了错误 |