cohttp_async_example

A simple example of use of the DuckDuckGo API server by cohttp.async.


In [1]:
#thread ;;
#require "yojson" ;;
#require "cohttp.top" ;;
#require "cohttp.async" ;;


/home/opam/.opam/4.04.1/lib/ocaml/threads: added to search path
/home/opam/.opam/4.04.1/lib/ocaml/unix.cma: loaded
/home/opam/.opam/4.04.1/lib/ocaml/threads/threads.cma: loaded
/home/opam/.opam/4.04.1/lib/easy-format: added to search path
/home/opam/.opam/4.04.1/lib/easy-format/easy_format.cmo: loaded
/home/opam/.opam/4.04.1/lib/biniou: added to search path
/home/opam/.opam/4.04.1/lib/biniou/biniou.cma: loaded
/home/opam/.opam/4.04.1/lib/yojson: added to search path
/home/opam/.opam/4.04.1/lib/yojson/yojson.cmo: loaded
/home/opam/.opam/4.04.1/lib/bytes: added to search path
/home/opam/.opam/4.04.1/lib/re: added to search path
/home/opam/.opam/4.04.1/lib/re/re.cma: loaded
/home/opam/.opam/4.04.1/lib/re/re_emacs.cma: loaded
/home/opam/.opam/4.04.1/lib/stringext: added to search path
/home/opam/.opam/4.04.1/lib/stringext/stringext.cma: loaded
/home/opam/.opam/4.04.1/lib/re/re_posix.cma: loaded
/home/opam/.opam/4.04.1/lib/ocaml/bigarray.cma: loaded
/home/opam/.opam/4.04.1/lib/sexplib/0: added to search path
/home/opam/.opam/4.04.1/lib/sexplib/0/sexplib0.cma: loaded
/home/opam/.opam/4.04.1/lib/sexplib: added to search path
/home/opam/.opam/4.04.1/lib/sexplib/sexplib.cma: loaded
/home/opam/.opam/4.04.1/lib/uri: added to search path
/home/opam/.opam/4.04.1/lib/uri/uri.cma: loaded
/home/opam/.opam/4.04.1/lib/base/caml: added to search path
/home/opam/.opam/4.04.1/lib/base/caml/caml.cma: loaded
/home/opam/.opam/4.04.1/lib/base/shadow_stdlib: added to search path
/home/opam/.opam/4.04.1/lib/base/shadow_stdlib/shadow_stdlib.cma: loaded
/home/opam/.opam/4.04.1/lib/base: added to search path
/home/opam/.opam/4.04.1/lib/base/base.cma: loaded
/home/opam/.opam/4.04.1/lib/fieldslib: added to search path
/home/opam/.opam/4.04.1/lib/fieldslib/fieldslib.cma: loaded
/home/opam/.opam/4.04.1/lib/base64: added to search path
/home/opam/.opam/4.04.1/lib/base64/base64.cma: loaded
/home/opam/.opam/4.04.1/lib/cohttp: added to search path
/home/opam/.opam/4.04.1/lib/cohttp/cohttp.cma: loaded
/home/opam/.opam/4.04.1/lib/cohttp/cohttp_top.cma: loaded
/home/opam/.opam/4.04.1/lib/uri/services.cma: loaded
/home/opam/.opam/4.04.1/lib/ppx_compare/runtime-lib: added to search path
/home/opam/.opam/4.04.1/lib/ppx_compare/runtime-lib/ppx_compare_lib.cma: loaded
/home/opam/.opam/4.04.1/lib/variantslib: added to search path
/home/opam/.opam/4.04.1/lib/variantslib/variantslib.cma: loaded
/home/opam/.opam/4.04.1/lib/bin_prot/shape: added to search path
/home/opam/.opam/4.04.1/lib/bin_prot/shape/bin_shape_lib.cma: loaded
/home/opam/.opam/4.04.1/lib/bin_prot: added to search path
/home/opam/.opam/4.04.1/lib/bin_prot/bin_prot.cma: loaded
/home/opam/.opam/4.04.1/lib/ppx_hash/runtime-lib: added to search path
/home/opam/.opam/4.04.1/lib/ppx_hash/runtime-lib/ppx_hash_lib.cma: loaded
/home/opam/.opam/4.04.1/lib/ppx_inline_test/config: added to search path
/home/opam/.opam/4.04.1/lib/ppx_inline_test/config/inline_test_config.cma: loaded
/home/opam/.opam/4.04.1/lib/ppx_inline_test/runtime-lib: added to search path
/home/opam/.opam/4.04.1/lib/ppx_inline_test/runtime-lib/ppx_inline_test_lib.cma: loaded
/home/opam/.opam/4.04.1/lib/core_kernel/base_for_tests: added to search path
/home/opam/.opam/4.04.1/lib/core_kernel/base_for_tests/base_for_tests.cma: loaded
/home/opam/.opam/4.04.1/lib/jane-street-headers: added to search path
/home/opam/.opam/4.04.1/lib/jane-street-headers/jane_street_headers.cma: loaded
/home/opam/.opam/4.04.1/lib/ocaml/nums.cma: loaded
/home/opam/.opam/4.04.1/lib/num-top: added to search path
/home/opam/.opam/4.04.1/lib/num-top/num_top.cma: loaded
/home/opam/.opam/4.04.1/lib/num: added to search path
/home/opam/.opam/4.04.1/lib/ppx_assert/runtime-lib: added to search path
/home/opam/.opam/4.04.1/lib/ppx_assert/runtime-lib/ppx_assert_lib.cma: loaded
/home/opam/.opam/4.04.1/lib/ppx_bench/runtime-lib: added to search path
/home/opam/.opam/4.04.1/lib/ppx_bench/runtime-lib/ppx_bench_lib.cma: loaded
/home/opam/.opam/4.04.1/lib/ppx_expect/common: added to search path
/home/opam/.opam/4.04.1/lib/ppx_expect/common/expect_test_common.cma: loaded
/home/opam/.opam/4.04.1/lib/ppx_expect/config: added to search path
/home/opam/.opam/4.04.1/lib/ppx_expect/config/expect_test_config.cma: loaded
/home/opam/.opam/4.04.1/lib/ppx_expect/collector: added to search path
/home/opam/.opam/4.04.1/lib/ppx_expect/collector/expect_test_collector.cma: loaded
/home/opam/.opam/4.04.1/lib/stdio: added to search path
/home/opam/.opam/4.04.1/lib/stdio/stdio.cma: loaded
/home/opam/.opam/4.04.1/lib/typerep: added to search path
/home/opam/.opam/4.04.1/lib/typerep/typerep_lib.cma: loaded
/home/opam/.opam/4.04.1/lib/core_kernel: added to search path
/home/opam/.opam/4.04.1/lib/core_kernel/core_kernel.cma: loaded
/home/opam/.opam/4.04.1/lib/async_kernel: added to search path
/home/opam/.opam/4.04.1/lib/async_kernel/async_kernel.cma: loaded
/home/opam/.opam/4.04.1/lib/async_rpc_kernel: added to search path
/home/opam/.opam/4.04.1/lib/async_rpc_kernel/async_rpc_kernel.cma: loaded
/home/opam/.opam/4.04.1/lib/sexplib/unix: added to search path
/home/opam/.opam/4.04.1/lib/sexplib/unix/sexplib_unix.cma: loaded
/home/opam/.opam/4.04.1/lib/spawn: added to search path
/home/opam/.opam/4.04.1/lib/spawn/spawn.cma: loaded
/home/opam/.opam/4.04.1/lib/core: added to search path
/home/opam/.opam/4.04.1/lib/core/core.cma: loaded
/home/opam/.opam/4.04.1/lib/async_unix: added to search path
/home/opam/.opam/4.04.1/lib/async_unix/async_unix.cma: loaded
/home/opam/.opam/4.04.1/lib/async_extra: added to search path
/home/opam/.opam/4.04.1/lib/async_extra/async_extra.cma: loaded
/home/opam/.opam/4.04.1/lib/async: added to search path
/home/opam/.opam/4.04.1/lib/async/async.cma: loaded
/home/opam/.opam/4.04.1/lib/ipaddr: added to search path
/home/opam/.opam/4.04.1/lib/ipaddr/ipaddr.cma: loaded
/home/opam/.opam/4.04.1/lib/result: added to search path
/home/opam/.opam/4.04.1/lib/result/result.cma: loaded
/home/opam/.opam/4.04.1/lib/logs: added to search path
/home/opam/.opam/4.04.1/lib/logs/logs.cma: loaded
/home/opam/.opam/4.04.1/lib/conduit: added to search path
/home/opam/.opam/4.04.1/lib/conduit/conduit.cma: loaded
/home/opam/.opam/4.04.1/lib/ipaddr/ipaddr_unix.cma: loaded
/home/opam/.opam/4.04.1/lib/conduit/conduit-async.cma: loaded
/home/opam/.opam/4.04.1/lib/magic-mime: added to search path
/home/opam/.opam/4.04.1/lib/magic-mime/magic_mime_library.cma: loaded
/home/opam/.opam/4.04.1/lib/fmt: added to search path
/home/opam/.opam/4.04.1/lib/fmt/fmt.cma: loaded
/home/opam/.opam/4.04.1/lib/logs/logs_fmt.cma: loaded
/home/opam/.opam/4.04.1/lib/fmt/fmt_tty.cma: loaded
/home/opam/.opam/4.04.1/lib/cohttp/cohttp_async.cma: loaded

In [2]:
open Core ;;
open Async ;;
open Cohttp ;;
open Cohttp_async ;;

In [3]:
Thread.create (fun () -> never_returns (Scheduler.go ())) () ;; (* Start the Async scheduler. *)


Out[3]:
- : Core.Thread.t = <abstr>

We obtain the meaning of a given query from the DuckDuckGo API server.

Yojson is a JSON serialization/deserialization library written in OCaml, and Yojson.Basic.Util contains utilities for parsing a JSON.


In [4]:
let search_query query =
  let base_uri = Uri.of_string "http://api.duckduckgo.com/?format=json" in
  let uri = Uri.add_query_param base_uri ("q", [query]) in
  Client.get uri >>= fun (resp, body) -> (* GET contents from a given uri *)
  assert (Response.status resp = `OK) ; (* Check HTTP response code *)
  Body.to_string body >>| fun body -> (* Receive contents *)
  let json = Yojson.Basic.from_string body in (* Parse a JSON *)
  (* Find field "Definition" or "Abstract" in a JSON *)
  let def = Yojson.Basic.Util.(json |> member "Definition" |> to_string_option) in
  let abs = Yojson.Basic.Util.(json |> member "Abstract" |> to_string_option) in
  match def with
  | None | Some "" -> abs
  | _ -> def


Out[4]:
val search_query : string -> string option Async_kernel__Deferred.t = <fun>

Thread_safe.block_on_async_exn waits an Async instance and returns its result.


In [5]:
Thread_safe.block_on_async_exn (fun () -> search_query "ocaml") ;;


Out[5]:
- : string option =
Some
 "OCaml, originally named Objective Caml, is the main implementation of the programming language Caml, created by Xavier Leroy, J\195\169r\195\180me Vouillon, Damien Doligez, Didier R\195\169my, Asc\195\161nder Su\195\161rez and others in 1996. A member of the ML language family, OCaml extends the core Caml language with object-oriented programming constructs."

In [ ]: