如何在OCaml中发出简单的GET请求?

dop*_*man 12 ocaml http

我正在尝试做一些应该简单的事情:向网址发出GET请求.然而,当我寻找的是如何做到这一点我经常例子风与像近乎胡言乱语.

有谁知道如何使用OCaml发出简单的HTTP请求?我是一个带有一些Haskell exp的OCaml新手.

注意:

使用尽可能低的OCaml的解决方案将是理想的.我已经看过Cohttp使用过这个库了,但我对本机(?)HTTPOCaml lib或者其他类似的东西更感兴趣.

响应于@antron,将非常感谢使用最低可能级别的本地OCaml的解决方案.我被引导相信这将涉及Unix图书馆.但是,如果有另一个不涉及第三方库的解决方案,那将同样受欢迎.

ant*_*ron 9

使用Cohttp库.请参阅客户端示例.

相关的是:

Cohttp_lwt_unix.Client.get (Uri.of_string "http://www.reddit.com/")
Run Code Online (Sandbox Code Playgroud)

这给你一对monad (response, body)内部Lwt.response基本上是一个记录,body是一个流.本例的其余部分只是打印一些有趣的内容.

  • Cohttp是OCaml中基本HTTP库的一个候选者(另一个是Ocamlnet,就像你发布的链接一样).如果你想要更低级别,你必须直接使用模块`Unix`(或`Lwt_unix`,如果你想使用并发monad - 另一种选择的并发monad是Async库).OCaml本身没有标准的HTTP库,但我认为社区目前或多或少已经确定了Cohttp. (3认同)

tbr*_*brk 6

也许在 OCaml 中发送 GET 请求的最基本方法是使用Unix库和Pervasives的基本输入/输出例程。

\n\n

这是一个非常简单的例子:

\n\n
let ip = Unix.((gethostbyname "caml.inria.fr").h_addr_list.(0))\nlet addr = Unix.ADDR_INET (ip, 80)\n\nlet sock = Unix.(socket PF_INET SOCK_STREAM 0)\nlet _ = Unix.connect sock addr\n\nlet in_ch = Unix.in_channel_of_descr sock\nlet out_ch = Unix.out_channel_of_descr sock\n\nlet _ =\n  output_string out_ch\n    "GET /pub/docs/manual-ocaml/index.html HTTP/1.1\\r\\n\\\n     Host: caml.inria.fr\\r\\n\\\n     User-Agent: OCaml\\r\\n\\\n     Connection: close\\r\\n\\\n     \\r\\n";\n  flush out_ch\n\nlet _ =\n  try\n    while true do\n      print_string (input_line in_ch)\n    done\n  with End_of_file ->\n    Unix.close sock\n
Run Code Online (Sandbox Code Playgroud)\n\n

如果将前缀放在文件顶部,则Unix.不需要前缀,但为了清楚起见,我更愿意将它们保留在其中。open Unix

\n\n

该程序可以用ocamlc unix.cma -o get get.ml.

\n\n

我同意@ChriS'的建议,阅读Leroy和R\xc3\xa9my\的OCaml中的Unix系统编程(我已经包含了在线版本的链接);这是一本很棒的书。

\n