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で作ったアプリ
- 無精・短気・傲慢