什么是Rest
REST(RepresentationalState Transfer)是Roy Fielding提出的一个描述互联系统架构风格的名词。REST定义了一组体系架构原则,可以根据这些原则设计以系统资源为中心的Web服务,包括使用不同语言编写的客户端如何通过HTTP处理和传输资源状态。
Restful是一种url风格,没有restful的情况下,服务端可以随心所欲提供自己的服务方式,比如访问一个get方法,获取数据要求地址为http://test/get,添加信息则要求http://test/post,而在Restful的限定下,地址都只能为http://test,而到底是获取还是添加,通过http的method是get还是post决定
RestTemplate是Spring提供的用于访问Rest服务的客户端(服务端是DispatchServlet)。RestTemplate可以通过使用ClientHttpRequestFactory来指定不同的HTTP请求方式:
SimpleClientHttpRequestFactory:RestTemplate默认是使用它,原理是调用jdk的HttpConnection,默认超时未-1;
HttpComponentsClientHttpRequestFactory:原理使用HttpClient连接池的方式。
RestTemplate源码分析
RestTemplate的api
提供了很多预置方法
// get
getForObject(String url, Class<T> responseType, Object... uriVariables)
getForEntity(String url, Class<T> responseType, Object... uriVariables)
……
// head
headForHeaders(String url, Object... uriVariables)
……
// post
postForObject(URI url, @Nullable Object request, Class<T> responseType)
……
// put
put(String url, @Nullable Object request, Object... uriVariables)
……
执行的时候实际上都通过execute方法,例如put方法
public void put(String url, @Nullable Object request, Map<String, ?> uriVariables)
throws RestClientException {
RequestCallback requestCallback = httpEntityCallback(request);
execute(url, HttpMethod.PUT, requestCallback, null, uriVariables);
}
其中,execute方法会最终调用到doExecute
public <T> T execute(URI url, HttpMethod method, @Nullable RequestCallback requestCallback,
@Nullable ResponseExtractor<T> responseExtractor) throws RestClientException {
return doExecute(url, method, requestCallback, responseExtractor);
}
doExecute
ClientHttpRequest request = createRequest(url, method);
构造Request,看createRequest方法补链接
if (requestCallback != null) {
requestCallback.doWithRequest(request);
}
response = request.execute();
handleResponse(url, method, response);
return (responseExtractor != null ? responseExtractor.extractData(response) : null);
Callback逻辑暂时不看,然后调用HttpComponentsStreamingClientHttpRequest#execute
(点我跳转补链接)这里真正到了执行,最后完成结果处理(点我跳转补链接)
createRequest
protected ClientHttpRequest createRequest(URI url, HttpMethod method) throws IOException {
ClientHttpRequest request = getRequestFactory().createRequest(url, method);
……
return request;
}
这里基于RequestFactory获取Request,HTTP请求是基于HttpComponentsClientHttpRequestFactory,对应createRequest方法如下:
public ClientHttpRequest createRequest(URI uri, HttpMethod httpMethod) throws IOException {
……
if (this.bufferRequestBody) {
return new HttpComponentsClientHttpRequest(client, httpRequest, context);
}
else {
return new HttpComponentsStreamingClientHttpRequest(client, httpRequest, context);
}
}
以HttpComponentsStreamingClientHttpRequest补链接为例
HttpComponentsStreamingClientHttpRequest
核心成员变量:
// Apache.httpClient对象
private final HttpClient httpClient;
这个
评论区