使用OCaml cohttp Client.post方法

时间:2016-12-01 16:49:36

标签: http-post ocaml

我尝试使用OCaml cohttp包使用Client.post方法发送POST请求。我查看了ocaml-cohttp/lib_test/test_net_lwt_client_and_server.ml中的示例以使用该方法,这里是使用该函数的示例中的代码段。

Client.post ~body:(Cohttp_lwt_body.of_string "barfoo") url

我在自己的代码中使用的功能完全相同:

Client.post ~body:(Cohttp_lwt_body.of_string bodyString) (Uri.of_string stringURI) >>= function
                            | Some (_, body) -> Cohttp_lwt_body.string_of_body body
                            | None -> return ""

但我收到错误消息:

Error: This pattern matches values of type 'a option
   but a pattern was expected which matches values of type
     Cohttp.Response.t * Cohttp_lwt_body.t

我查看https://github.com/mirage/ocaml-cohttp/issues/64建议将~body标签更改为?body,但后来又出现了不同的错误:

Error: This expression has type Cohttp_lwt_body.t
   but an expression was expected of type Cohttp_lwt_body.t option

有人可以解释一下如何正确使用此功能吗?

1 个答案:

答案 0 :(得分:2)

错误消息表明这是输入问题:

Error: This pattern matches values of type 'a option
   but a pattern was expected which matches values of type
     Cohttp.Response.t * Cohttp_lwt_body.t

应该重写绑定右侧的function正文(>>=)以处理由Client.post而不是option类型返回的元组。例如:

Client.post
  ~body:(Cohttp_lwt_body.of_string bodyString)
  (Uri.of_string stringURI)
>>= fun (response, body) ->
match response with
| { Cohttp.Response.status = `OK; _ } -> ok_response_action body
| { Cohttp.Response.status; _ } -> other_response_action status body
遗憾的是,cohttp目前没有易于访问的文档。您需要直接从源中引用.mli文件。例如,有关Cohttp.Response.t类型结构的信息,请参阅here