2013-06-12 54 views
3

Ocsigen/Eliom tutorial從提供「Hello,world!」的應用程序開始。作爲HTML:使用Ocsigen爲JSON提供服務的標準方法是什麼?

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)通過使用OCaml的型像這樣來創建一個JSON類型:

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

這將創建對應於OCaml類型的JSON類型。

這裏使用這種類型與服務器通信(如果您不知道服務器的功能,這裏的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。

(對不起,我不能超過2個鏈接:)但你可以在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。因此,您可以使用JSON值的OCaml表示(並且不要自己調用序列化程序)。查看Eliom_registration.String等模塊是如何實現的,以瞭解如何執行此操作。
+1

json-wheel已過時,請改用yojson – romerun

相關問題