• 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参数处理、请求体格式选择、异常处理和日志记录。你可以根据你的需求进一步扩展和定制它。

  • 相关阅读:
    filebeat新filestream类型是否支持tail_files类似功能探究
    input允许多行输入
    计算机操作系统:二级页表原理
    EF7学习指南
    【Transformers】第 7 章 :问答
    React项目实战之租房app项目(一)项目搭建&底部导航栏
    深度学习复盘与论文复现B
    图神经网络笔记(一)
    ChatGPT的原理与前端领域实践
    Python游戏开发实战:飞机大战(含代码)
  • 原文地址:https://blog.csdn.net/qq_38096989/article/details/140375298