RestTemplate使用

本文介绍如何创建线程安全的RestTemplate单例,并通过懒汉模式实现。文章详细展示了如何配置请求超时时间、添加消息转换器及错误处理等步骤。此外还提供了GET和POST请求的具体使用示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

创建线程安全的RestTemplate单例(懒汉模式)

@Component
@Lazy(false)
public class SimpleRestClient {

    private static final Logger LOGGER = LoggerFactory.getLogger(SimpleRestClient.class);

    private static RestTemplate restTemplate;

    static {
        SimpleClientHttpRequestFactory requestFactory = new SimpleClientHttpRequestFactory();
        requestFactory.setReadTimeout(5000);
        requestFactory.setConnectTimeout(5000);

        // 添加转换器
        List<HttpMessageConverter<?>> messageConverters = new ArrayList<>();
        messageConverters.add(new StringHttpMessageConverter(Charset.forName("UTF-8")));
        messageConverters.add(new MappingJackson2HttpMessageConverter());

        // 解决formdata中文乱码
        List<HttpMessageConverter<?>> converters = new ArrayList<>();
        converters.add(new ByteArrayHttpMessageConverter());
        converters.add(new ResourceHttpMessageConverter());
        converters.add(new StringHttpMessageConverter(StandardCharsets.UTF_8));
        FormHttpMessageConverter formConverter = new FormHttpMessageConverter();
        formConverter.setPartConverters(converters);
        formConverter.setCharset(StandardCharsets.UTF_8);
        formConverter.setMultipartCharset(StandardCharsets.UTF_8); // 解决文件名中文乱码
        messageConverters.add(formConverter);

        restTemplate = new RestTemplate(messageConverters);
        restTemplate.setRequestFactory(requestFactory);
        restTemplate.setErrorHandler(new DefaultResponseErrorHandler());

        LOGGER.info("SimpleRestClient初始化完成");
    }

    private SimpleRestClient() {

    }

    @PostConstruct
    public static RestTemplate getClient() {
        return restTemplate;
    }

}

GET

1、带header的get

HttpHeaders headers = new HttpHeaders();
headers.add("ApiKey", token);
// 发送请求
ResponseEntity<String> exchange = restTemplate.exchange(
    url
    , HttpMethod.GET
    , new HttpEntity<String>(headers)
    , String.class);
String res = exchange.getBody();

POST

1、带header和body的post

RestTemplate restTemplate = new RestTemplate();
HttpHeaders headers = new HttpHeaders();
// 设置content-type
MediaType type = MediaType.parseMediaType("application/json;charset=UTF-8");
headers.setContentType(type);
// 设置请求头
headers.add("ApiKey", param.getStr("ApiKey"));
// 当没有请求头信息时,用  MultiValueMap<String, Object> map=new LinkedMultiValueMap<>();
// 当有请求头信息时,用 HashMap<String, Object> map = new HashMap<>();
HashMap<String, Object> body = new HashMap<>();
body.put("CustomerKey", param.getStr("CustomerKey"));
body.put("StartIndex", 0);// 开始条数
body.put("EndIndex", 1000);// 结束条数
//用HttpEntity封装整个请求报文
HttpEntity<HashMap<String, Object>> httpEntity = new HttpEntity<>(body, headers);

//服务端返回的json格式:
String result = restTemplate.postForObject(realTimeDataUrl, httpEntity, String.class);

2、formdata上传文件

RestTemplate restTemplate = SimpleRestClient.getClient();
String url = aiCenterUrl + "/chat/multiple";
HttpHeaders headers = new HttpHeaders();
headers.add("api-key", startKey);
headers.setContentType(MediaType.MULTIPART_FORM_DATA);
// 构建 multipart/form-data 请求体
MultiValueMap<String, Object> body = new LinkedMultiValueMap<>();
body.set("chatId", chatId);
body.set("prompt", input);
body.add("file", new ClassPathResource("myFile. jpg"));
// 用HttpEntity封装整个请求报文
HttpEntity<MultiValueMap<String, Object>> httpEntity = new HttpEntity<>(body, headers);
String respStr = restTemplate.postForObject(url, httpEntity, String.class);

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值