• HttpUtils工具类


    1. 添加超时设置
    2. 支持多种请求体格式(如JSON、表单)
    3. 处理URL参数
    4. 增加异常处理
    5. 增加日志记录
    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参数处理、请求体格式选择、异常处理和日志记录。你可以根据你的需求进一步扩展和定制它。

  • 相关阅读:
    整理37个超牛逼的Python库,用过一半算你牛
    【音视频】音视频开发与学习
    外卖订单语音通知功能如何实现?(附外卖订单语音通知模板)
    博客网页制作基础大二dw作业 web课程设计网页制作 个人网页设计与实现 我的个人博客网页开发
    map & set
    VR全景技术在教育中的应用:VR教学的“因材施教”
    97%的客户说评论影响购买决策,那么跨境商家如何影响这97%呢?
    正则表达式 || 遇到字符串里面有() 就在括号后面换行
    docker network create命令
    Go 必知的10个命令
  • 原文地址:https://blog.csdn.net/qq_38096989/article/details/140375298