Cohttp - 匹配不同的HTTP响应代码

时间:2014-07-07 23:24:35

标签: http ocaml http-status

使用Cohttp_async执行请求时,我按以下方式处理HTTP响应代码302(临时重定向):

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 个答案:

答案 0 :(得分: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. *)

省略最后一个案例会使编译器抱怨非详尽的检查。