为什么要处理http请求异常?
因为网络是不稳定的、不可靠的,不能保证每次通知每次请求都可以发送或者接受成功。
最近在优化之前公司之前用的支付服务,要求对可能出现的所有网络状况进行异常处理,保证任何情况下都有良好的处理方式。
公司当前的采用了分布式系统来支持整个购票支付业务流程,其中涉及到网络的部分有1、票务服务去三方票务系统中查询票务;2、票务服务通知支付服务生成订单;3、支付完成之后付款方回调支付服务;4、支付服务回调票务服务通知付款结果。我们今天就来和大家讨论和分享一下最后一条第四点的中可能存在的请求异常。
我们服务直接的调用用的是原始的http调用restful风格的API,在支付服务中使用的是okhttp3。
OkHttp 是一个高效的 HTTP 客户端,具有非常多的优势:
1.能够高效的执行 http,数据加载速度更快,更省流量
2.支持 GZIP 压缩,提升速度,节省流量
3.缓存响应数据,避免了重复的网络请求
4.使用简单,支持同步阻塞调用和带回调的异步调用
先创建一个okhttpclient,分别设置了链接超时时间和响应超时时间都是三秒。
private static OkHttpClient client = client.newBuilder().connectTimeout(3000, TimeUnit.MILLISECONDS).readTimeout(3000, TimeUnit.MILLISECONDS).build();
post调用方法
private static final MediaType JSON = MediaType.parse("application/json; charset=utf-8");
public static String post(String url, String json) throws IOException {
RequestBody body = RequestBody.create(JSON, json);
Request request = new Request.Builder()
.url(url)
.post(body)
.build();
Response response = client.newCall(request).execute();
return response.body().string();
}
我们可以发现在调用的过程中会抛出IOException,我们需要做的就是在业务逻辑中try/catch异常,并进行区分,做出相应的处理即可。
try {
post(url,jsonParam);
}carch (IOException e) {
//捕获到超时异常的时候,做出对应的处理操作
if( e instanceof ConnectException ){
doSomething();
}
//捕获到相应异常的时候,做出对应的操作
if(e instanceof SocketTimeoutException) {
doSomething();
}
}