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

相关推荐

  1. HttpUtils工具

    2024-07-13 23:20:03       50 阅读
  2. HttpUtils工具

    2024-07-13 23:20:03       19 阅读
  3. HttpUtil工具

    2024-07-13 23:20:03       24 阅读
  4. httpsUtils

    2024-07-13 23:20:03       20 阅读
  5. HttpUtil的定义

    2024-07-13 23:20:03       28 阅读
  6. tornado.httputil.HTTPFile

    2024-07-13 23:20:03       28 阅读
  7. 工具】对象比较工具实现

    2024-07-13 23:20:03       19 阅读
  8. webrtc 工具

    2024-07-13 23:20:03       52 阅读
  9. date工具

    2024-07-13 23:20:03       46 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-07-13 23:20:03       66 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-07-13 23:20:03       70 阅读
  3. 在Django里面运行非项目文件

    2024-07-13 23:20:03       57 阅读
  4. Python语言-面向对象

    2024-07-13 23:20:03       68 阅读

热门阅读

  1. 风景区服务热线系统:智能化时代的旅游新选择

    2024-07-13 23:20:03       21 阅读
  2. acnconda虚拟环境管理笔记

    2024-07-13 23:20:03       21 阅读
  3. Spring基础知识

    2024-07-13 23:20:03       18 阅读
  4. 计算机课程名,汇总

    2024-07-13 23:20:03       16 阅读
  5. Python的基础语法——持续更新版

    2024-07-13 23:20:03       18 阅读