2014-07-07 104 views
1

匹配當使用Cohttp_async執行以下列方式的請求,我處理302(臨時重定向)的HTTP響應代碼:Cohttp - 在不同的HTTP響應代碼

let rec download uri = 
    Cohttp_async.Client.get uri 
    >>= fun (response, body) -> 
    let http_code = Cohttp.Code.code_of_status (Cohttp.Response.status response) in 
    if Cohttp.Code.is_redirection http_code then 
    (* Code to handle the redirect *) 
    else Cohttp_async.Body.to_string body 

這似乎好嗎工作(至少在我使用它的簡單情況下)。我主要想知道是否有更好的方法來做到這一點。我認爲可能有更好的方法來處理這個問題,比如通過匹配Cohttp.Code.status。例如:

match http_code with 
    | Ok -> Cohttp_async.Body.to_string body 
    | Temporary_redirect -> (* Code to handle the redirect *) 
    | _ -> (* Failure here, possibly *) 

到目前爲止,我還沒有太多運氣,因爲它似乎我不匹配正確的構造函數。

作爲第二方面的問題,Cohttp是否有更好的方式來處理HTTP重定向作爲響應的一部分?也許我這樣做的方式是錯誤的,並且有一個更簡單的方法。

+1

您應該至少在您的構造函數名稱中添加back-ticks,因爲它們是多態變體 – ivg

+0

我有一些學習要做,因爲我不太確定多態變體是什麼。我認爲你指的是我試圖匹配的模式 - 據我所知,'Ok'和'Temporary_redirect'是cohttp的'Code'模塊中定義的類型:https://github.com/avsm/ocaml- cohttp /斑點/主/ cohttp/code.mli。我想我的問題是否以及如何在此代碼中使用狀態類型。 –

+1

多態變異體可以通過前面的反萃來區別於普通的變體,我不會提供一個例子,因爲我認爲反萃將被SO吃掉。多態變體不應使用模塊名稱限定,以便它們都位於全局名稱空間中。他們有其他功能,但對於這種情況就足夠了。 – ivg

回答

1

我相信我的問題的簡短答案是,當我試圖在response上匹配時指的是錯誤類型。存在兩種多態類型 - OkOK,其中後者是用於HTTP 200響應代碼的Cohttp類型。在我的情況,我也不得不處理一些類型的重定向,我在加入

因此,代碼最終看起來像這樣:

let rec download uri = 
    Cohttp_async.Client.get uri 
    >>= fun (response, body) -> 
    let http_code = Cohttp.Response.status response in 
    match http_code with 
    | `OK -> Cohttp_async.Body.to_string body (* If we get a status of OK *) 
    | `Temporary_redirect | `Found -> (* Handle redirection *) 
    | _ -> return "" (* Catch-all for other scenarios. Not great. *) 

省略最後一種情況將會使編譯器抱怨非詳盡的檢查。

相關問題