Какой канонический способ служить JSON с использованием Ocsigen?

Учебник по Ocsigen/Eliom начинается с примера приложения, которое отображает "Hello, world!" как HTML:

open Eliom_content.Html5.D

let main_service =
  Eliom_registration.Html5.register_service
    ~path:["graff"]
    ~get_params:Eliom_parameter.unit
    (fun () () ->
      Lwt.return
         (html
           (head (title (pcdata "Page title")) [])
           (body [h1 [pcdata "Graffiti"]])))

Как можно вместо этого служить JSON? В частности, как зарегистрировать службу JSON и какие библиотеки / комбинаторы следует использовать для генерации / сериализации JSON (js_of_ocaml?)?

2 ответа

Решение

Я не уверен, что понимаю, что вы хотите сделать, но в отношении JSON вы можете использовать "получение" (см. Deriving_Json) для создания типа JSON с использованием типа OCaml, например:

    type deriving_t = (string * string) deriving (Json)

Это создаст тип JSON, соответствующий типу OCaml.

Вот способ использования этого типа для связи с сервером (если вы не знаете серверные функции, вот документация об этом и о клиентских значениях на стороне сервера):

    (* first you have to create a server function (this allowed the client to call a function from the server *)
    let json_call =
      server_function
        Json.t<deriving_t>
        (fun (a,b) ->
           Lwt.return (print_endline ("log on the server: "^a^b)))

    (* let say that distillery has already generate all the needed stuff (main_service, Foobar_app, etc..) *)
    let () =
      Foobar_app.register
        ~service:main_service
        (fun () () ->
           {unit{
             (* here I call my server function by using ocaml types directly, it will be automatically serialize *)
             ignore (%json_call ("hello", "world"))
           }};
           Lwt.return
             (Eliom_tools.F.html
                ~title:"foobar"
                ~css:[["css";"foobar.css"]]
                Html5.F.(body [
                   h2 [pcdata "Welcome from Eliom's distillery!"];
               ])))

Если вы хотите использовать связь между клиентом и сервером, вам следует обратиться к Eliom_bus, Eliom_comet или Eliom_react.

(извините, я не могу сделать больше двух ссылок:), но вы найдете документацию на сайте ocsigen.org).

Надеюсь, что это может помочь вам.

  • Если вы хотите общаться с клиентской программой Eliom, вам не нужно сериализовывать свои данные в JSON. Сериализация / десериализация любого типа OCaml выполняется автоматически Eliom. Просто используйте сервисы OCaml (или, проще: функции сервера и вызовите функцию из вашей клиентской программы OCaml).
  • Если вы хотите использовать свой собственный формат JSON, вам нужно иметь собственную функцию сериализации в JSON (или, например, использовать некоторую библиотеку ocaml, такую ​​как json-wheel, для генерации JSON). В этом случае вы можете зарегистрировать свой сервис, используя Eliom_registration.String вместо Eliom_registration.Html5. Функция-обработчик должна возвращать значение JSON в виде строки и тип содержимого.
  • Можно даже определить свой собственный модуль регистрации, который будет использоваться вместо Eliom_registration.String. Таким образом, вы можете использовать OCaml-представление значения JSON (и вы не вызываете сериализатор самостоятельно). Посмотрите, как реализованы такие модули, как Eliom_registration.String, чтобы узнать, как это сделать.
Другие вопросы по тегам