如何有效处理HTTP请求异常

一、HTTP请求异常的种类

在处理HTTP请求异常之前,我们需要清楚的了解HTTP请求异常的种类。HTTP请求异常包括但不限于:

1、网络异常:如DNS解析失败、网络连接超时等


try{
    httpclient.execute(httpget)
}catch(UnknownHostException | ConnectTimeoutException e){
    //处理网络异常
}

2、服务器异常:如响应码不是200、服务器返回的JSON信息格式不规范等


HttpResponse response = httpclient.execute(httpget);
if(response.getStatusLine().getStatusCode() != HttpStatus.SC_OK){
    //处理服务器异常
}

3、业务异常:如用户登录信息错误、订单不存在等


HttpResponse response = httpclient.execute(httpget);
String result = EntityUtils.toString(response.getEntity());
ResultDTO resultDTO = JSON.parseObject(result, ResultDTO.class);
if(resultDTO.getCode() != ResultCode.SUCCESS.getCode()){
    //处理业务异常
}

二、如何有效处理HTTP请求异常

在开发过程中,我们需要遵循以下几个原则来处理HTTP请求异常:

1、明确异常的类型,合理区分异常的处理方式。

2、充分利用HTTP中请求响应的状态码和异常信息,特别是在服务器异常时需要充分利用返回的错误信息来解决问题。

3、通过记录日志的方式,快速定位问题所在。

4、业务异常需要使用自定义异常来处理,一方面能够更好的维护异常逻辑,另一方面能够在异常处理层面区分业务异常与其它异常。

三、HTTP请求异常处理的最佳实践

1、封装工具类。将HTTP请求的重试、重定向、异常处理封装到工具类中,使得代码更简洁,维护更方便。


public static String get(String url) {
    CloseableHttpClient httpClient = HttpClients.createDefault();
    String result = null;
    HttpGet httpGet = new HttpGet(url);
    try (CloseableHttpResponse response = httpClient.execute(httpGet)) {
        if (response.getStatusLine().getStatusCode() == HttpStatus.SC_OK) {
            HttpEntity entity = response.getEntity();
            if (entity != null) {
                result = EntityUtils.toString(entity, "UTF-8");
            }
        } else {
            throw new RuntimeException("HTTP请求异常!");
        }
    } catch (IOException e) {
        throw new RuntimeException("网络异常!");
    } finally {
        try {
            httpClient.close();
        } catch (IOException e) {
            throw new RuntimeException("关闭httpClient异常!");
        }
    }
    return result;
}

2、自定义异常。通过自定义异常来对HTTP请求异常进行分类处理。


public class BusinessException extends RuntimeException {

    private static final long serialVersionUID = 1L;
    private Integer code;
    private String message;

    public BusinessException(ResultCode resultCode) {
        super(resultCode.getMessage());
        this.code = resultCode.getCode();
        this.message = resultCode.getMessage();
    }

    public Integer getCode() {
        return code;
    }

    public String getMessage() {
        return message;
    }
}

3、日志记录。在处理异常时,需要及时记录错误信息,方便进行问题定位和修复。


private static final Logger logger = LoggerFactory.getLogger(HttpClientUtil.class);

public static String get(String url) {
    CloseableHttpClient httpClient = HttpClients.createDefault();
    String result = null;
    HttpGet httpGet = new HttpGet(url);
    try (CloseableHttpResponse response = httpClient.execute(httpGet)) {
        if (response.getStatusLine().getStatusCode() == HttpStatus.SC_OK) {
            HttpEntity entity = response.getEntity();
            if (entity != null) {
                result = EntityUtils.toString(entity, "UTF-8");
            }
        } else {
            logger.error("请求失败,url: {}, statusCode: {}", url, response.getStatusLine().getStatusCode());
            throw new BusinessException(ResultCode.HTTP_REQUEST_ERROR);
        }
    } catch (IOException e) {
        logger.error("请求异常,url: {}", url, e);
        throw new BusinessException(ResultCode.NETWORK_ERROR);
    } finally {
        try {
            httpClient.close();
        } catch (IOException e) {
            logger.error("关闭httpClient异常", e);
            throw new BusinessException(ResultCode.HTTP_CLIENT_CLOSE_ERROR);
        }
    }
    return result;
}

原创文章,作者:小蓝,如若转载,请注明出处:https://www.506064.com/n/257480.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
小蓝小蓝
上一篇 2024-12-15 12:45
下一篇 2024-12-15 12:45

相关推荐

  • Python如何判断质数和异常处理

    本文主要介绍Python如何判断质数和异常处理,其中包括多个方面的内容。 一、判断质数 1、定义:质数是指除了1和它本身两个因数外,没有其他的因数。 2、判断方法: (1)从2到n…

    编程 2025-04-29
  • 光模块异常,SFP未认证(entityphysicalindex=6743835)——解决方案和

    如果您遇到类似optical module exception, sfp is not certified. (entityphysicalindex=6743835)的问题,那么…

    编程 2025-04-29
  • 数据库第三范式会有删除插入异常

    如果没有正确设计数据库,第三范式可能导致删除和插入异常。以下是详细解释: 一、什么是第三范式和范式理论? 范式理论是关系数据库中的一个规范化过程。第三范式是范式理论中的一种常见形式…

    编程 2025-04-29
  • ROS线程发布消息异常解决方法

    针对ROS线程发布消息异常问题,我们可以从以下几个方面进行分析和解决。 一、检查ROS代码是否正确 首先,我们需要检查ROS代码是否正确。可能会出现的问题包括: 是否正确初始化RO…

    编程 2025-04-28
  • Python捕获异常后重新执行的方法

    本文将从捕获异常的基本概念入手,介绍Python中如何捕获异常后重新执行代码的方法,旨在帮助读者更好地理解Python异常处理机制。 一、异常处理机制基础 在Python中,异常处…

    编程 2025-04-27
  • Python OOM异常的原因和解决方法

    Out of Memory(OOM)异常是 Python 程序在内存不足或不足以分配新的对象时,抛出的异常之一。Python 应用程序通常会因为内存瓶颈而崩溃或降低性能,但这并不是…

    编程 2025-04-27
  • 为什么要加请求头(HTTP Header)?

    在进行网页抓取(Web Scraping)时,请求头(HTTP Header)扮演着非常重要的角色。请求头中包含了用户代理(User Agent)、cookie、referer等信…

    编程 2025-04-27
  • 如何使用Python剔除异常值

    本文将详细介绍如何使用Python剔除异常值。异常值是在一个数据集中与其他数据点明显不同的值,会影响到数据的分析和可视化。 一、找出异常值 首先需要找出异常值。可以使用Python…

    编程 2025-04-27
  • Python常见异常类型解析

    本文将阐述Python常见异常类型,包括其定义、分类及处理方法。 一、语法错误 语法错误是指在Python代码编写过程中出现的错误,这是一种最常见的错误类型。当Python解释器无…

    编程 2025-04-27
  • HTTP请求方式的选择:POST还是GET?

    对于使用xxl-job进行任务调度的开发者,通常需要发送HTTP请求来执行一些任务。但是在发送请求时,我们总是会遇到一个问题:是使用POST还是GET?下面将从多个方面对这个问题进…

    编程 2025-04-27

发表回复

登录后才能评论