0
我剛開始使用jcabi
流利的http客戶端,我覺得我錯過了一些常規的錯誤處理例程(我相信每個jcabi-http
用戶都面臨它)。使用jcabi-http客戶端時處理http錯誤的常用方法是什麼?
所以,一開始總是有IOException
當我使用fetch()
或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);
}
下一頁時,我想不同的行爲爲401,403,5XX的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);
}
這個「代碼進化」看起來像一個共同的模式,我重塑WHE埃爾。
也許有一個已經實現(或描述)的解決方案(或Wire.class)?
我指的是代碼看起來像這樣可以在項目中使用jcabi-HTTP已經實現了樣板。你能說明你的項目是如何完成的嗎? – Rodion
@Rodion我更新了我的答案 – yegor256