2017-09-26 40 views
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)?

回答

0
+0

我指的是代碼看起來像這樣可以在項目中使用jcabi-HTTP已經實現了樣板。你能說明你的項目是如何完成的嗎? – Rodion

+0

@Rodion我更新了我的答案 – yegor256

相關問題