- 添加超时设置
- 支持多种请求体格式(如JSON、表单)
- 处理URL参数
- 增加异常处理
- 增加日志记录
import org.springframework.http.*;
import org.springframework.stereotype.Component;
import org.springframework.web.client.RestTemplate;
import org.springframework.web.util.UriComponentsBuilder;
import java.util.Map;
@Component
public class HttpUtils {
private final RestTemplate restTemplate;
public HttpUtils(RestTemplate restTemplate) {
this.restTemplate = restTemplate;
}
public String get(String url, Map<String, String> headers, Map<String, String> params) {
HttpHeaders httpHeaders = new HttpHeaders();
headers.forEach(httpHeaders::set);
HttpEntity<String> entity = new HttpEntity<>(httpHeaders);
UriComponentsBuilder builder = UriComponentsBuilder.fromHttpUrl(url);
if (params != null) {
params.forEach(builder::queryParam);
}
ResponseEntity<String> response = restTemplate.exchange(builder.toUriString(), HttpMethod.GET, entity, String.class);
return handleResponse(response);
}
public String post(String url, Map<String, String> headers, Object body, MediaType mediaType) {
HttpHeaders httpHeaders = new HttpHeaders();
headers.forEach(httpHeaders::set);
httpHeaders.setContentType(mediaType);
HttpEntity<Object> entity = new HttpEntity<>(body, httpHeaders);
ResponseEntity<String> response = restTemplate.exchange(url, HttpMethod.POST, entity, String.class);
return handleResponse(response);
}
public String put(String url, Map<String, String> headers, Object body, MediaType mediaType) {
HttpHeaders httpHeaders = new HttpHeaders();
headers.forEach(httpHeaders::set);
httpHeaders.setContentType(mediaType);
HttpEntity<Object> entity = new HttpEntity<>(body, httpHeaders);
ResponseEntity<String> response = restTemplate.exchange(url, HttpMethod.PUT, entity, String.class);
return handleResponse(response);
}
public String delete(String url, Map<String, String> headers, Map<String, String> params) {
HttpHeaders httpHeaders = new HttpHeaders();
headers.forEach(httpHeaders::set);
HttpEntity<String> entity = new HttpEntity<>(httpHeaders);
UriComponentsBuilder builder = UriComponentsBuilder.fromHttpUrl(url);
if (params != null) {
params.forEach(builder::queryParam);
}
ResponseEntity<String> response = restTemplate.exchange(builder.toUriString(), HttpMethod.DELETE, entity, String.class);
return handleResponse(response);
}
private String handleResponse(ResponseEntity<String> response) {
if (response.getStatusCode().is2xxSuccessful()) {
return response.getBody();
} else {
// 这里可以根据需要自定义异常处理
throw new RuntimeException("Request failed with status code: " + response.getStatusCode());
}
}
}
添加超时设置
为了设置超时,我们需要创建一个自定义的RestTemplate
bean:
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.client.HttpComponentsClientHttpRequestFactory;
import org.springframework.web.client.RestTemplate;
@Configuration
public class AppConfig {
@Bean
public RestTemplate restTemplate() {
HttpComponentsClientHttpRequestFactory factory = new HttpComponentsClientHttpRequestFactory();
factory.setConnectTimeout(5000);
factory.setReadTimeout(5000);
return new RestTemplate(factory);
}
}
增加日志记录
我们可以使用SLF4J来记录请求和响应日志:
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.http.*;
import org.springframework.stereotype.Component;
import org.springframework.web.client.RestTemplate;
import org.springframework.web.util.UriComponentsBuilder;
import java.util.Map;
@Component
public class HttpUtils {
private static final Logger logger = LoggerFactory.getLogger(HttpUtils.class);
private final RestTemplate restTemplate;
public HttpUtils(RestTemplate restTemplate) {
this.restTemplate = restTemplate;
}
public String get(String url, Map<String, String> headers, Map<String, String> params) {
HttpHeaders httpHeaders = new HttpHeaders();
headers.forEach(httpHeaders::set);
HttpEntity<String> entity = new HttpEntity<>(httpHeaders);
UriComponentsBuilder builder = UriComponentsBuilder.fromHttpUrl(url);
if (params != null) {
params.forEach(builder::queryParam);
}
logger.info("Sending GET request to URL: {}, with headers: {}, and params: {}", url, headers, params);
ResponseEntity<String> response = restTemplate.exchange(builder.toUriString(), HttpMethod.GET, entity, String.class);
return handleResponse(response);
}
public String post(String url, Map<String, String> headers, Object body, MediaType mediaType) {
HttpHeaders httpHeaders = new HttpHeaders();
headers.forEach(httpHeaders::set);
httpHeaders.setContentType(mediaType);
HttpEntity<Object> entity = new HttpEntity<>(body, httpHeaders);
logger.info("Sending POST request to URL: {}, with headers: {}, and body: {}", url, headers, body);
ResponseEntity<String> response = restTemplate.exchange(url, HttpMethod.POST, entity, String.class);
return handleResponse(response);
}
public String put(String url, Map<String, String> headers, Object body, MediaType mediaType) {
HttpHeaders httpHeaders = new HttpHeaders();
headers.forEach(httpHeaders::set);
httpHeaders.setContentType(mediaType);
HttpEntity<Object> entity = new HttpEntity<>(body, httpHeaders);
logger.info("Sending PUT request to URL: {}, with headers: {}, and body: {}", url, headers, body);
ResponseEntity<String> response = restTemplate.exchange(url, HttpMethod.PUT, entity, String.class);
return handleResponse(response);
}
public String delete(String url, Map<String, String> headers, Map<String, String> params) {
HttpHeaders httpHeaders = new HttpHeaders();
headers.forEach(httpHeaders::set);
HttpEntity<String> entity = new HttpEntity<>(httpHeaders);
UriComponentsBuilder builder = UriComponentsBuilder.fromHttpUrl(url);
if (params != null) {
params.forEach(builder::queryParam);
}
logger.info("Sending DELETE request to URL: {}, with headers: {}, and params: {}", url, headers, params);
ResponseEntity<String> response = restTemplate.exchange(builder.toUriString(), HttpMethod.DELETE, entity, String.class);
return handleResponse(response);
}
private String handleResponse(ResponseEntity<String> response) {
if (response.getStatusCode().is2xxSuccessful()) {
logger.info("Received response: {}", response.getBody());
return response.getBody();
} else {
// 这里可以根据需要自定义异常处理
logger.error("Request failed with status code: {}", response.getStatusCode());
throw new RuntimeException("Request failed with status code: " + response.getStatusCode());
}
}
}
现在,你的HttpUtils
工具类已经更加完善,支持超时设置、URL参数处理、请求体格式选择、异常处理和日志记录。你可以根据你的需求进一步扩展和定制它。