2014-07-07 72 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. *) 

省略最后一种情况将会使编译器抱怨非详尽的检查。

相关问题