我尝试做一些简单的事情:向网址发出GET请求。但是,当我搜索如何执行此操作的示例时,我经常会遇到像this这样的近乎胡言乱语。
有谁知道如何使用OCaml发出简单的HTTP请求?我是一个有一些Haskell exp的OCaml新手。
注意:
使用最低级别OCaml的解决方案将是理想的。我已经看过使用的Cohttp
库,但我对原生(?)HTTP
OCaml库或其他类似的东西更感兴趣。
在回应@antron
时,我们非常感谢使用最低级别本机OCaml的解决方案。我认为这将涉及Unix
库。但是,如果有另一个不涉及第三方库的解决方案,那将同样受欢迎。
答案 0 :(得分:9)
使用Cohttp库。请参阅Client example。
相关的一行是:
Cohttp_lwt_unix.Client.get (Uri.of_string "http://www.reddit.com/")
这会在(response, body)
monad中为您提供一对Lwt
。 response
基本上是一条记录,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(我已包含在线版本的链接);这是一本好书。