目 录CONTENT

文章目录

spring-RestTemplate

FatFish1
2025-03-13 / 0 评论 / 0 点赞 / 25 阅读 / 0 字 / 正在检测是否收录...

什么是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;

这个

0

评论区