A simple wrapper around OCurl, for easy tasks around http.
be as simple to use as possible.
be as reliable as possible (work is done by cURL and the ocurl bindings anyway).
stable API with few dependencies, so that user code compiles without breakage
for a long time.
for the synchronous library:
opam install ezcurl
for the lwt-baed library:
opam install ezcurl-lwt(depends on
A small web crawler can be found in
examples/argiope. It's very incomplete
and naive but demonstrates basic usage of
The library lives in a module
Ezcurl, which wraps
Curl.t with functions
get that combine many different low level API calls into one.
It also follows redirections by default, and returns a
object that contains the body, headers, and error code.
# #require "ezcurl";; # let url = "https://curl.haxx.se/";; val url : string = "https://curl.haxx.se/" # let res = Ezcurl.get ~url ();; ... # let content = match res with Ok c -> c | Error (_,s) -> failwith s;; val content : Ezcurl_core.response = ... # content.Ezcurl.code;; - : int = 200
It is also possible to create a client with
Ezcurl.make() and re-use
it across calls with the optional parameter
ezcurl-lwt, a module
Ezcurl_lwt becomes available, with
functions that are similar to the ones in
Ezcurl but are non blocking.
This makes it easy to run several queries in parallel:
# #require "ezcurl-lwt";; # let urls = [ "https://en.wikipedia.org/wiki/CURL"; "https://en.wikipedia.org/wiki/OCaml"; "https://curl.haxx.se/"; ];; val urls : string list = ["https://en.wikipedia.org/wiki/CURL"; "https://en.wikipedia.org/wiki/OCaml"; "https://curl.haxx.se/"] # open Lwt.Infix;; # let codes = List.map (fun url -> Ezcurl_lwt.get ~url ()) urls |> Lwt_list.map_p (fun fut -> fut >>= function | Ok r -> Lwt.return r.Ezcurl_lwt.code | Error e -> Lwt.fail (Failure "oh no")) ;; ... # codes;; - : int list = [200; 200; 200]