我尝试使用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
有人可以解释一下如何正确使用此功能吗?
答案 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。