3

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?)?

4

2 回答 2

6
  • 如果您想与客户端 Eliom 程序进行通信,您不需要将自己的数据序列化为 JSON。Eliom 自动完成任何 OCaml 类型的序列化/反序列化。只需使用 OCaml 服务(或者,更简单:服务器函数并从您的 OCaml 客户端程序调用该函数)。
  • 如果你想使用自己的 JSON 格式,你需要有自己的 JSON 序列化函数(或者例如使用一些像 json-wheel 这样的 ocaml 库来生成 JSON)。在这种情况下,您可以使用 Eliom_registration.String 而不是 Eliom_registration.Html5 注册您的服务。处理函数必须将 JSON 值作为字符串和内容类型返回。
  • 甚至可以定义自己的注册模块,用来代替 Eliom_registration.String。因此,您可以使用 JSON 值的 OCaml 表示形式(并且您不需要自己调用序列化程序)。看看 Eliom_registration.String 之类的模块是如何实现的,以了解如何做到这一点。
于 2013-06-13T15:39:29.233 回答
5

我不确定你想做什么,但是,关于 JSON,你可以使用“派生”(参见Deriving_Json)通过使用这样的 OCaml 类型来创建 JSON 类型:

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

这将创建对应于 OCaml 类型的 JSON 类型。

这里是使用这种类型与服务器通信的方式(如果你不知道服务器功能,这里是关于它和服务器端客户端值的文档)

    (* 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。

(抱歉,我不能创建超过 2 个链接 :) 但您可以在 ocsigen.org 网站上找到文档)。

希望能帮到你。

于 2013-06-13T15:57:47.187 回答