1

を使用Cohttp_asyncしてリクエストを実行する場合、HTTP レスポンス コード 302 (Temporary Redirect) を次の方法で処理しています。

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

私の質問に対する簡単な答えは、 on に一致させようとしたときに間違った型を参照していたということだと思いresponseます。と の 2 つのポリモーフィック タイプが存在しOkます。OK後者は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 に答える