1

Cohttp_async用于执行请求时,我正在以下列方式处理 302(临时重定向)的 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

这似乎工作正常(至少在我使用它的简单情况下)。我主要想看看是否有更好的方法来做到这一点。我认为可能有更好的方法来处理这个问题,比如匹配 on 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 重定向作为响应的一部分返回?也许我要解决这个问题的方式是错误的,并且有一个更简单的方法。

4

1 回答 1

1

我相信对我的问题的简短回答是我在尝试匹配时指的是错误的类型response。存在两种多态类型 -OkOK,其中后者是CohttpHTTP 200 响应代码的类型。在我的情况下,我还必须处理我添加的几种重定向。

因此,代码最终看起来像这样:

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. *)

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

于 2014-07-15T01:38:19.650 回答