• spring boot


    RestTemplate 源码的简单分析

    //使用示例 
        @PostMapping("/judge")
        public boolean judge() {
            RestTemplate restTemplate = new RestTemplate();
            String fooResourceUrl
                    = "http://localhost:8080/spring-rest/foos";
            ResponseEntity<String> response
                    = restTemplate.getForEntity(fooResourceUrl + "/1", String.class);
            return  false;
        }
    
    
    
    	@Override
    	public <T> ResponseEntity<T> postForEntity(String url, @Nullable Object request,
    			Class<T> responseType, Object... uriVariables) throws RestClientException {
    
    		RequestCallback requestCallback = httpEntityCallback(request, responseType);
    		ResponseExtractor<ResponseEntity<T>> responseExtractor = responseEntityExtractor(responseType);
    		return nonNull(execute(url, HttpMethod.POST, requestCallback, responseExtractor, uriVariables));
    	} 
    
    
    	...
    
    
    	@Nullable
    	protected <T> T doExecute(URI url, @Nullable HttpMethod method, @Nullable RequestCallback requestCallback,
    			@Nullable ResponseExtractor<T> responseExtractor) throws RestClientException {
    
    		...
    
    		ClientHttpResponse response = null;
    		try {
    			ClientHttpRequest request = createRequest(url, method);
    			if (requestCallback != null) {
    				requestCallback.doWithRequest(request);
    			}
    			response = request.execute();
    			handleResponse(url, method, response);
    			return (responseExtractor != null ? responseExtractor.extractData(response) : null);
    		}
    		catch (IOException ex) {
    			...
    		}
    		finally {
    			...
    		}
    	}
    
    
    
    

    到了 HttpAccessor 的 createRequest 方法

    	protected ClientHttpRequest createRequest(URI url, HttpMethod method) throws IOException {
    		ClientHttpRequest request = getRequestFactory().createRequest(url, method);
    		initialize(request);
    		if (logger.isDebugEnabled()) {
    			logger.debug("HTTP " + method.name() + " " + url);
    		}
    		return request;
    	}
    
    
    	/**
    	 * Return the request factory that this accessor uses for obtaining client request handles.
    	 */
    	public ClientHttpRequestFactory getRequestFactory() {
    		return this.requestFactory;
    	}
    
    

        而 ClientHttpRequestFactory 是什么。

    1297993-20200302160053731-688295459.jpg

        这张图就可以看出 ClientHttpRequestFactory 的实现有多个,而 RestTemplate则封装了组装、发送 HTTP消息,以及解析响应的底层细节。

        spring 很多也进行这样的封装,比如log 。

    参考资料

    • https://www.baeldung.com/rest-template (template 使用)
  • 相关阅读:
    Ext js-02 -官方API文档使用
    [Python3网络爬虫开发实战] 1.1-Python3的安装
    什么是关系型数据库?
    htaccess分布式配置文件常用写法
    PHP无限极分类
    svn在linux上的安装
    优化Web中的性能
    Python 面向对象(初级篇)
    文本日期提取
    HMM分词实例
  • 原文地址:https://www.cnblogs.com/Benjious/p/12396281.html
Copyright © 2020-2023  润新知