0

我刚开始使用jcabifluent 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)?

4

1 回答 1

0

你做的一切都是正确的。IOException如果有一些网络问题会发生,AssertionError是飞出的assert*()方法。其余的取决于您的业务逻辑。

几个例子:

于 2017-09-26T13:11:45.887 回答