创建线程安全的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);