使用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重定向作为响应的一部分返回?也许我这样做的方式是错误的,并且有一种更简单的方法。
答案 0 :(得分:1)
我相信我的问题的简短回答是我在尝试匹配response
时指的是错误的类型。存在两种多态类型 - Ok
和OK
,其中后者是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. *)
省略最后一个案例会使编译器抱怨非详尽的检查。