当使用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
时引用了错误的类型。存在两种多态类型——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. *)
省略最后一个案例将使编译器抱怨非详尽检查。