2013-06-12 2 views
3

Ocsigen/Eliom tutorial начинается с примера приложения, которое обслуживает «Привет, мир!». как HTML:Каков канонический способ использования JSON с использованием Ocsigen?

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

ответ

5

Я не уверен, чтобы понять, что вы хотите сделать, но, о JSON, вы можете использовать «вывод» (см Deriving_Json), чтобы создать тип JSON, используя тип OCaml, как это:

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

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

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

(* 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).

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

6
  • Если вы хотите общаться с клиентской программой 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, чтобы знать, как это сделать.
+1

json-wheel устарел, вместо этого используйте yojson – romerun