我刚开始使用jcabi
fluent http 客户端,我觉得我缺少一些通用的错误处理例程(我相信每个jcabi-http
用户都会遇到它)。
因此,首先,IOException
当我使用fetch()
or时json().readObject()
,我的第一次尝试看起来像这样:
try {
return new JdkRequest("http://localhost")
.uri()
...
.back()
.method(Request.GET)
.fetch()
.as(JacksonResponse.class)
.json().readObject()
...;
} catch (IOException e) {
throw new RuntimeException(e);
}
接下来,当响应的状态不是 200 OK 时,会json().readObject()
失败并显示“这不是你给我的 json”的错误。所以我添加了状态检查:
try {
return new JdkRequest("http://localhost")
...
.fetch()
.as(RestResponse.class)
.assertStatus(HttpURLConnection.HTTP_OK)
.as(JacksonResponse.class)
...;
} catch (IOException e) {
throw new RuntimeException(e);
}
当状态不是 200 OK 时,我收到 AssertionError,我必须处理它以赋予它一些业务意义:
try {
return new JdkRequest("http://localhost")
...
.fetch()
.as(RestResponse.class)
.assertStatus(HttpURLConnection.HTTP_OK)
.as(JacksonResponse.class)
...;
} catch (IOException ex) {
throw new RuntimeException(ex);
}
} catch (AssertionError error) {
wrapBusiness(error);
}
接下来,当我想为 5xx 状态的 401、403、404 获得不同的行为时,我的代码将转换为如下所示:
try {
val response = new JdkRequest("http://localhost")
...
.fetch()
.as(RestResponse.class);
HttpStatusHandlers.of(response.status()).handle();
return response
.as(JacksonResponse.class)
...;
} catch (IOException ex) {
throw new RuntimeException(ex);
}
这种“代码进化”看起来像是一种常见的模式,我正在重新发明轮子。
也许有一个已经实现(或描述)的解决方案(或 Wire.class)?