如何将基于CloseableHttpResponse的POST代码重构为RestTemplate并解决空响应
RestTemplate重构方案
重构后返回null与入参为String类型无关,通常是请求头配置错误、响应解析逻辑配置不当导致的,以下是完全对齐原有逻辑的重构实现:
步骤1:配置RestTemplate(若项目中未自动注入可添加)
import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.http.client.ClientHttpResponse; import org.springframework.web.client.ResponseErrorHandler; import org.springframework.web.client.RestTemplate; @Configuration public class RestTemplateConfig { @Bean public RestTemplate restTemplate() { RestTemplate restTemplate = new RestTemplate(); // 配置错误处理器,和原有HttpClient逻辑对齐:不抛出非2xx状态码异常,直接读取响应 restTemplate.setErrorHandler(new ResponseErrorHandler() { @Override public boolean hasError(ClientHttpResponse response) { return false; } @Override public void handleError(ClientHttpResponse response) { // 不做异常抛出处理 } }); return restTemplate; } }
步骤2:重构GenericRestClientImpl实现
import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import org.springframework.beans.factory.annotation.Value; import org.springframework.http.HttpEntity; import org.springframework.http.HttpHeaders; import org.springframework.http.MediaType; import org.springframework.http.ResponseEntity; import org.springframework.stereotype.Component; import org.springframework.web.client.RestTemplate; @Component public class GenericRestClientImpl implements GenericRestClient { @Value("${auth.string}") private String authString; private final RestTemplate restTemplate; private static Logger logger = LogManager.getLogger(GenericRestClientImpl.class); // 构造注入RestTemplate public GenericRestClientImpl(RestTemplate restTemplate) { this.restTemplate = restTemplate; } @Override public String httpPostData(String jsonstr, String posturl) { System.out.println("JSON to send: " + jsonstr); logger.info("JSON to send: " + jsonstr); // 构造请求头,和原有逻辑完全对齐 HttpHeaders headers = new HttpHeaders(); headers.setContentType(MediaType.APPLICATION_JSON); headers.set("Authorization", authString); // 构造请求实体 HttpEntity<String> request = new HttpEntity<>(jsonstr, headers); // 发起POST请求,获取完整响应(包含状态码、响应体等) ResponseEntity<String> response = restTemplate.postForEntity(posturl, request, String.class); // 打印日志和原有逻辑对齐 logger.info("response status code :" + response.getStatusCodeValue()); logger.info("response status line :" + response.getStatusCode()); String result = response.getBody(); logger.info("response data :" + result); return result; } }
关键说明
- 上述实现完全对齐原有Apache HttpClient版本的逻辑,包含日志打印、头信息设置、异常处理规则
- String类型的JSON请求体可以直接被RestTemplate原生支持,不需要额外转换
- 如果调用后还是返回null,可先检查
${auth.string}配置是否正确注入,目标接口是否正常返回响应内容
内容的提问来源于stack exchange,提问作者piri
相关产品推荐
相关产品推荐

