mojolicious memo
perl WAF
Mojolicious(モジョリシャス)はperl製のWebアプリケーションフレームワークです。2つのウェブサーバが同梱されていてmojoliciousだけセットアップすれはwebを開発、公開できます。1つはmorbo (モーボ)で開発用のサーバーです。起動しっぱなしでも起動後に更新されたモジュールがロードされます。もう1つのhypnotoad (ハイプノトード)はプリフォークサーバーでホットデプロイメントを行うことができます。
- 起動
$ morbo script/<myApp> → Server available at http://127.0.0.1:3000 - or - $ hypnotoad script/<myApp>
データベースにSQLiteを使えばサーバーを立てずにお手軽にWebを公開出来ます。
mojoliciousでJSONをPOSTで送信と受信
デモ画面を作ってみた。
[toolmmt/templates/json/json.html.ep]
% layout 'default'; % title 'mojplicious JSON DEMO'; <h1>mojolicious JSON Demo</h1> <hr><h4>JSON</h4> <ul> <li><a href="http://www21051ue.sakura.ne.jp:3003/api/json/json_test01">json_test001</a></li> </ul> <h4>JSON POST</h4> <script type="text/javascript"> $(function(){ $("#response").html("Response Values"); $("#button").click( function(){ var url = $("#url_post").val(); var JSONdata = { value1: $("#value1").val(), value2: $("#value2").val() }; // alert(JSON.stringify(JSONdata)); $.ajax({ type : 'post', url : url, data : JSON.stringify(JSONdata), contentType: 'application/JSON', dataType : 'JSON', scriptCharset: 'utf-8', success : function(data) { // Success // alert("success"); // alert(JSON.stringify(data)); $("#response").html(JSON.stringify(data)); }, error : function(data) { // Error alert("error"); alert(JSON.stringify(data)); $("#response").html(JSON.stringify(data)); } }); }) }) </script> <h2>HTMLファイルからPOSTでJSONデータを送信する</h2> <p>URL: <input type="text" id="url_post" name="url" size="100" value="<%== url_for %>"></p> <p>value1: <input type="text" id="value1" size="30" value="値1"></p> <p>value2: <input type="text" id="value2" size="30" value="値2"></p> <p><button id="button" type="button">submit</button></p> <textarea id="response" cols=120 rows=10 disabled></textarea>
[toolmmt/lib/Tool/mmt/Controller/Json.pm]
package Tool::mmt::Controller::Json; use Mojo::Base 'Tool::mmt::Controller::Mmt'; sub json_post{ my $s = shift; use Mojo::UserAgent; my $ua = Mojo::UserAgent->new; my $data = $ua->post('http://localhost:3001/api/example/json' => {Accept=> '*/*'} => json => {a => 'b'}); $s->render(json => $data->res->json); } sub json_test01{ my $s = shift; $s->render(json => {head => 'Json Test Data',array=>[1,2,3,4],lang=>['perl','ruby','php'], 日本語=>['漢字','ひらがな','カタカナ']}); } sub json{ my $s = shift; $s->render(json => $s->req->json); } 1;
コントローラーのディレクトリが変わった
どのバージョンで変わったか解らないがコントローラーのディレクトリが変わっていた。以前はlib/<myApp>の下がコントローラだったがlib/<myApp>/Controller下になっていた。両方のバージョンで動かす為にはstartupにてnamespacesを設定する。
$r->namespaces(['Tool::mmt::Controller']);
render()のpartialが効かなくなった!
レンダーした結果を出力せず変数に格納したいときにpartial=>1としていたが効かなくなった。単に"1"が帰ってくる。下記URLで教えてもらった。renderをrender_to_stringに変更すれば大丈夫!
- $s->json_or_jsonp( $s->render(json => $perl_object, partial => 1) + $s->json_or_jsonp( $s->render_to_string(json => $perl_object)
https://kantaro-cgi.com/blog/mojolicious/not_work_render_partial.html
オプショナルなプレースホルダー
ふたつのオプショナルなプレースホルダーが、スラッシュによって分割されている場合だけ、 スラッシュはオプショナルなものになります。
# / -> {controller => 'foo', action => 'bar'} # /users -> {controller => 'users', action => 'bar'} # /users/list -> {controller => 'users', action => 'list'} $r->get('/:controller/:action')->to('foo#bar');
controllerやactionなどの特別なスタッシュの値もまたプレースホルダーとなりえます。これによってきわめて柔軟なルーティングの構築が可能になります。 これは開発の間は特にとても便利ですが、 すべてのコントローラーメソッドがルーティングになる可能性 があるので、注意深く利用すべきです。 アンダースコアで始まるこれらのメソッドと同じように、すべての大文字のメソッドは 自動的にルーターから隠されます。 追加的に隠すためにMojolicious::Routesのhideを使うこともできます。
/:controller/:actionでコントローラとアクション(メソッド)を柔軟に設定できます。
mojoliciousで作ったアプリ
- 無精・短気・傲慢