当使用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重定向?也许我的做法是错误的,还有一个更简单的方法。

最佳答案

我相信我的问题的简短答案是,我在试图匹配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. *)

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

07-26 09:36