使用jcabi-http客户端时,处理http错误的常用方法是什么?

时间:2017-09-26 05:58:46

标签: java http client jcabi

我刚刚开始使用jcabi流畅的http客户端,我觉得我缺少一些常规错误处理例程(我相信每个jcabi-http用户都面对它)。

因此,当我使用IOExceptionfetch()并且我的第一次尝试看起来像这样时,总是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时,我收到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);
}

接下来,当我想获得401,403,404的5xx状态的不同行为时,我的代码将变成这样的东西:

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)?

1 个答案:

答案 0 :(得分:0)