Как я могу передать user_type от клиента Eliom к coservice?

http://ocsigen.org/eliom/manual/server-params показывает пример службы GET, которая принимает пользовательский тип. Я хотел бы вызвать coservice с user_type со стороны клиента, с тем же типом на стороне клиента. Кажется, это должно быть возможно, но я получаю

ocsigenserver: main: Exn during page generation: Failure("User service parameters 'foo' type not supported client side.") (sending 500)

когда я пытаюсь

{shared{
  open Eliom_lib
  open Eliom_content
  open Html5.D

  type foo = A | B
  let foo_of_string = function "a" -> A | "b" -> B | _ -> raise (Failure "foo_of_string: unsupported foo")
  let string_of_foo = function A -> "a" | B -> "b"
}}

let foo_to_div foo : Html5_types.div Html5.elt Lwt.t = match foo with A -> Lwt.return (div [pcdata "aye"]) | B -> Lwt.return (div [pcdata "bee"])
let foo_service =
  Eliom_registration.Ocaml.register_post_coservice'
    ~post_params:Eliom_parameter.(user_type foo_of_string string_of_foo "foo")
    (fun () foo -> foo_to_div foo)

{client{
  let test () =
    Eliom_client.call_ocaml_service ~service:%foo_service () A
 }}


(* Boilerplate from eliom-distillery: *)
module Testing_app = Eliom_registration.App
  (struct let application_name = "testing" end)
let main_service =
  Eliom_service.App.service ~path:[] ~get_params:Eliom_parameter.unit ()
let () =
  Testing_app.register ~service:main_service
    (fun () () -> Lwt.return (Eliom_tools.F.html ~title:"foo"
                                Html5.F.(body [ pcdata "bar" ])))

Я также попытался использовать функцию server_function, но затем столкнулся с проблемой того, как вернуть div в качестве json; дела

type div_elt = Html5_types.div Eliom_content.Html5.elt
let div_elt_json = Json.t<div_elt>

дает мне Error: Unbound module Html5_types.Json_div

1 ответ

Случайно прокрутив немного вниз после прочтения о функциях сервера, я нашел http://ocsigen.org/eliom/4.1/manual/clientserver-communication который вместо этого говорит:

{shared{ 
  type foo = A | B deriving (Json)
  type foo_json = Json.t<foo>
}}
let foo_service =
  Eliom_registration.Ocaml.register_post_coservice'
    ~post_params:Eliom_parameter.(ocaml "param" foo_json)
    (fun () foo -> foo_to_div foo)

И это работает = D

(Хотя я все же предпочел бы использовать server_function, которая кажется немного более лаконичной.)

Другие вопросы по тегам