今回書いた全ソースコードはgithubのリポジトリのtut3ディレクトリにあります.
前回はローカルの手書きHTMLからサービスに向ってPOSTリクエストを投げましたが,今回はリクエストを投げるHTMLをWebアプリで出すようにします.その前の準備として前回のままだと不都合があるので,main_serviceを 1. サービスを受け持つ部分 2. ページを出力する部分 の2つに分割します.
let main_service = Eliom_services.service ~path:["index"] ~get_params:unit () let comment_service = Eliom_services.post_service ~fallback:main_service ~post_params:(string "name" ** string "comment" ** string "submit") () let main_page = register ~service:main_service (fun () () -> (* HTML出力部.あとでフォームを出力するように置き換える *) Lwt.return (html (head (title (pcdata "")) []) (body [p [pcdata "hogehoge"]]))) |
つまり,register_serviceというのはserviceとregisterを一挙にやってくれていたわけです.
次にHTML出力部をフォームを出力するように置き換えます.
let f = (Eliom_output.Html5.post_form comment_service (fun (name, (comment, submit)) -> [p [pcdata "name: "; string_input ~input_type:`Text ~name:name (); pcdata "comment: "; string_input ~input_type:`Text ~name:comment (); string_input ~input_type:`Submit ~name:submit ~value:"Post" ()]]) ()) in return (html (head (title (pcdata "")) []) (body [f])) |
Eliom_output.Html5.post_formの最初の引数でどのサービスに向ってリクエストを投げるかを指定し,次の引数でPOSTリクエストのパラメータからどのようなフォームを作るかを指定します.ここでcomment_serviceを参照する必要があったので,serviceとregisterを分割しました.いやlet rec使えば分割しないでも行けたんですけど,ややこしくなるので.
string_inputはEliom_output.Html5.string_inputのことです.まあそんなに難しくないと思います.
こうすることにより,/indexにアクセスするとフォームが表示されるようになります.