RestTemplate-postForObject源碼


參數:    請求路徑, 請求參數, 返回類型, 擴展模板變量
 
參數:    請求參數, 返回類型
 
HttpEntityRequestCallback構造器
HttpEntityRequestCallback是RestTemplate的私有內部類,繼承了RestTemplate私有內部類 AcceptHeaderRequestCallback,AcceptHeaderRequestCallback實現了RequestCallback接口,重寫了doWithRequest方法
HttpEntity是    HTTP請求或響應實體
 
public void doWithRequest(ClientHttpRequest httpRequest) throws IOException {
    //調用父類方法
    super.doWithRequest(httpRequest);
    Object requestBody = this.requestEntity.getBody();
    //判斷內部類中的HttpEntity是否有參數
    if (requestBody == null) {
        HttpHeaders httpHeaders = httpRequest.getHeaders();
        HttpHeaders requestHeaders = this.requestEntity.getHeaders();
        if (!requestHeaders.isEmpty()) {
            //如果header不為空,將header的值賦給方法接收的參數ClientHttpRequest
            requestHeaders.forEach((key, values) -> {
                httpHeaders.put(key, new LinkedList(values));
            });
        }
        //添加content長度
        if (httpHeaders.getContentLength() < 0L) {
            httpHeaders.setContentLength(0L);
        }
    } else {
        Class<?> requestBodyClass = requestBody.getClass();
        Type requestBodyType = this.requestEntity instanceof RequestEntity ? ((RequestEntity)this.requestEntity).getType() : requestBodyClass;
        HttpHeaders httpHeadersx = httpRequest.getHeaders();
        HttpHeaders requestHeadersx = this.requestEntity.getHeaders();
        MediaType requestContentType = requestHeadersx.getContentType();
        //消息轉換器列表
        Iterator var8 = RestTemplate.this.getMessageConverters().iterator();
        while(var8.hasNext()) {
            //策略接口,指定可以從HTTP請求和響應轉換的轉換器
            HttpMessageConverter<?> messageConverter = (HttpMessageConverter)var8.next();
            if (messageConverter instanceof GenericHttpMessageConverter) {
                //可以將HTTP請求轉換為指定泛型類型的目標對象,將指定泛型類型的源對象轉換為HTTP響應
                GenericHttpMessageConverter<Object> genericConverter = (GenericHttpMessageConverter)messageConverter;
                //判斷  指示此轉換器是否可以寫入給定的類
                if (genericConverter.canWrite((Type)requestBodyType, requestBodyClass, requestContentType)) {
                    if (!requestHeadersx.isEmpty()) {
                        requestHeadersx.forEach((key, values) -> {
                            httpHeadersx.put(key, new LinkedList(values));
                        });
                    }
                    //打印debug日志
                    this.logBody(requestBody, requestContentType, genericConverter);
                    將給定對象寫入給定的輸出消息
                    genericConverter.write(requestBody, (Type)requestBodyType, requestContentType, httpRequest);
                    return;
                }
            } else if (messageConverter.canWrite(requestBodyClass, requestContentType)) {
                if (!requestHeadersx.isEmpty()) {
                    requestHeadersx.forEach((key, values) -> {
                        httpHeadersx.put(key, new LinkedList(values));
                    });
                }
                this.logBody(requestBody, requestContentType, messageConverter);
                messageConverter.write(requestBody, requestContentType, httpRequest);
                return;
            }
        }
        String message = "No HttpMessageConverter for [" + requestBodyClass.getName() + "]";
        if (requestContentType != null) {
            message = message + " and content type [" + requestContentType + "]";
        }
        throw new RestClientException(message);
    }
}
private void logBody(Object body, @Nullable MediaType mediaType, HttpMessageConverter<?> converter) {
    if (RestTemplate.this.logger.isDebugEnabled()) {
        if (mediaType != null) {
            RestTemplate.this.logger.debug("Writing [" + body + "] as \"" + mediaType + "\"");
        } else {
            String classname = converter.getClass().getName();
            RestTemplate.this.logger.debug("Writing [" + body + "] with " + classname);
        }
    }
}
 
響應提取器,它使用給定的實體轉換器 將響應轉換為類型T
 
最后的execute方法
@Nullable
public <T> T execute(String url, HttpMethod method, @Nullable RequestCallback requestCallback, @Nullable ResponseExtractor<T> responseExtractor, Object... uriVariables) throws RestClientException {
    //使用URI變量映射展開給定的URI模板
    URI expanded = this.getUriTemplateHandler().expand(url, uriVariables);
    return this.doExecute(expanded, method, requestCallback, responseExtractor);
}
 
參數:url - 要連接的完全擴展的URL, method - 要執行的HTTP方法(GET,POST等), requestCallback- 准備請求的對象(可以null), responseExtractor- 從響應中提取返回值的對象(可以null)
@Nullable
protected <T> T doExecute(URI url, @Nullable HttpMethod method, @Nullable RequestCallback requestCallback, @Nullable ResponseExtractor<T> responseExtractor) throws RestClientException {
    Assert.notNull(url, "URI is required");
    Assert.notNull(method, "HttpMethod is required");
    ClientHttpResponse response = null;
    Object var14;
    try {
        //通過工廠模式創建ClientHttpRequest對象
        ClientHttpRequest request = this.createRequest(url, method);
        if (requestCallback != null) {
            requestCallback.doWithRequest(request);
        }
        //執行請求
        response = request.execute();
        //處理給定的響應,執行適當的日志記錄並在ResponseErrorHandler必要時調用
        this.handleResponse(url, method, response);
        //extractData  從給定數據中提取數據ClientHttpResponse並將其返回
        var14 = responseExtractor != null ? responseExtractor.extractData(response) : null;
    } catch (IOException var12) {
        String resource = url.toString();
        String query = url.getRawQuery();
        resource = query != null ? resource.substring(0, resource.indexOf(63)) : resource;
        throw new ResourceAccessException("I/O error on " + method.name() + " request for \"" + resource + "\": " + var12.getMessage(), var12);
    } finally {
        if (response != null) {
            response.close();
        }
    }
    return var14;
}
 
 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM