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

时间:2016-03-17 19:54:41

标签: http ocaml

我尝试做一些简单的事情:向网址发出GET请求。但是,当我搜索如何执行此操作的示例时,我经常会遇到像this这样的近乎胡言乱语。

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

注意:

使用最低级别OCaml的解决方案将是理想的。我已经看过使用的Cohttp库,但我对原生(?)HTTP OCaml库或其他类似的东西更感兴趣。

在回应@antron时,我们非常感谢使用最低级别本机OCaml的解决方案。我认为这将涉及Unix库。但是,如果有另一个不涉及第三方库的解决方案,那将同样受欢迎。

3 个答案:

答案 0 :(得分:9)

使用Cohttp库。请参阅Client example

相关的一行是:

Cohttp_lwt_unix.Client.get (Uri.of_string "http://www.reddit.com/")

这会在(response, body) monad中为您提供一对Lwtresponse基本上是一条记录,body是一个流。本例的其余部分只是打印一些有趣的内容。

答案 1 :(得分:1)

对于OCaml中的低级Unix编程(即使你对它不太了解),我推荐优秀的书Unix System Programming in OCaml。它会告诉你如何编写你想要的客户端。

答案 2 :(得分:1)

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

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

let ip = Unix.((gethostbyname "caml.inria.fr").h_addr_list.(0))
let addr = Unix.ADDR_INET (ip, 80)

let sock = Unix.(socket PF_INET SOCK_STREAM 0)
let _ = Unix.connect sock addr

let in_ch = Unix.in_channel_of_descr sock
let out_ch = Unix.out_channel_of_descr sock

let _ =
  output_string out_ch
    "GET /pub/docs/manual-ocaml/index.html HTTP/1.1\r\n\
     Host: caml.inria.fr\r\n\
     User-Agent: OCaml\r\n\
     Connection: close\r\n\
     \r\n";
  flush out_ch

let _ =
  try
    while true do
      print_string (input_line in_ch)
    done
  with End_of_file ->
    Unix.close sock

如果将Unix.放在文件顶部,则open Unix前缀不是必需的,但是为了清楚起见,我宁愿保留它们。

可以使用ocamlc unix.cma -o get get.ml将程序编译为字节码。

我同意@ChriS建议阅读Leroy和Rémy的Unix system programming in OCaml(我已包含在线版本的链接);这是一本好书。