我正在尝试做一些应该简单的事情:向网址发出GET请求.然而,当我寻找的是如何做到这一点我经常例子风与像近乎胡言乱语此.
有谁知道如何使用OCaml发出简单的HTTP请求?我是一个带有一些Haskell exp的OCaml新手.
注意:
使用尽可能低的OCaml的解决方案将是理想的.我已经看过Cohttp使用过这个库了,但我对本机(?)HTTPOCaml lib或者其他类似的东西更感兴趣.
响应于@antron,将非常感谢使用最低可能级别的本地OCaml的解决方案.我被引导相信这将涉及Unix图书馆.但是,如果有另一个不涉及第三方库的解决方案,那将同样受欢迎.
使用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是一个流.本例的其余部分只是打印一些有趣的内容.
也许在 OCaml 中发送 GET 请求的最基本方法是使用Unix库和Pervasives的基本输入/输出例程。
\n\n这是一个非常简单的例子:
\n\nlet 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\nRun Code Online (Sandbox Code Playgroud)\n\n如果将前缀放在文件顶部,则Unix.不需要前缀,但为了清楚起见,我更愿意将它们保留在其中。open Unix
该程序可以用ocamlc unix.cma -o get get.ml.
我同意@ChriS'的建议,阅读Leroy和R\xc3\xa9my\的OCaml中的Unix系统编程(我已经包含了在线版本的链接);这是一本很棒的书。
\n