You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将基于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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 00:45:05