documents:proglang:perl:perl-015
差分
このページの2つのバージョン間の差分を表示します。
| 両方とも前のリビジョン前のリビジョン | |||
| documents:proglang:perl:perl-015 [2026/05/17 15:01] – [PerlのCGI.pmとJSON.pmでJSONデータを受信・送信] k896951 | documents:proglang:perl:perl-015 [2026/05/30 18:46] (現在) – ↷ 移動操作に合わせてリンクを書き換えました。 k896951 | ||
|---|---|---|---|
| 行 1: | 行 1: | ||
| + | ====== 007.PerlのCGI.pmとJSON.pmでJSONデータを受信・送信 ====== | ||
| + | 2017/ | ||
| + | 受信サイズ制限は入れようぜとの事なので追加。 | ||
| + | |||
| + | 2017/ | ||
| + | 自分用メモ。正確性の保証なし。 | ||
| + | |||
| + | ===== サーバサイド ===== | ||
| + | |||
| + | ==== Webサーバ ==== | ||
| + | |||
| + | ドメインAに配置したコンテンツをロードしたブラウザから、JavaScriptを使って別のドメインBにあるコンテンツへのアクセスはできない。\\ | ||
| + | CORS(Cross-Origin Resource Sharing)という制約に引っかかる。\\ | ||
| + | ドメインAにプロキシーになるプログラムを配置するなどしてこれを回避する方法もあるが、Cookieなどを必要とする場合うまく動作しない。 | ||
| + | |||
| + | ドメインBからのレスポンスヘッダに「うちのコンテンツ使用をドメインAに許可するよ」というお許しの印を追加して貰う必要がある。ブラウザのJavaScriptはそれを確認して初めて動作する。 | ||
| + | |||
| + | https:// | ||
| + | |||
| + | 以下はApacheの.htaccessに記述した例。 | ||
| + | |||
| + | < | ||
| + | Header set Access-Control-Allow-Origin " | ||
| + | Header set Access-Control-Allow-Headers " | ||
| + | </ | ||
| + | |||
| + | ブラウザのJavaScriptからの利用を考えないならこれはやらなくても構わないけど、やれた方がいろいろ応用できるだろうから、余裕があれば適用しておく。 | ||
| + | |||
| + | レスポンスヘッダ Access-Control-Allow-Origin でリクエストを出した側にコンテンツの使用を許可する。 " | ||
| + | こちらで試した限りではこのヘッダだけでは駄目で、レスポンスヘッダ Access-Control-Allow-Headers で " | ||
| + | |||
| + | |||
| + | ==== 処理コード説明 ==== | ||
| + | |||
| + | Content-Type: | ||
| + | Perlコードはeuc-jpなエンコードで記述している。 | ||
| + | |||
| + | 若様に「eval使うの怖いすなぁ」と言われたけど、try … catch の標準的なPerl表現は eval なのです。evalで囲む範囲を狭めた方がよいのは確かな話。このサンプルぐらいでしょう許されそうなのは。 | ||
| + | |||
| + | <code perl sitteru.pl> | ||
| + | use CGI; | ||
| + | use JSON; | ||
| + | use Encode; | ||
| + | |||
| + | $CGI:: | ||
| + | |||
| + | my %reply = ( decode(' | ||
| + | decode(' | ||
| + | decode(' | ||
| + | decode(' | ||
| + | decode(' | ||
| + | my $fmt1 = decode(' | ||
| + | my $fmt2 = decode(' | ||
| + | my $cgi = CGI-> | ||
| + | my $json = JSON-> | ||
| + | my $ans; | ||
| + | |||
| + | ## | ||
| + | ## " | ||
| + | ## " | ||
| + | my $postdata = $cgi-> | ||
| + | |||
| + | eval { | ||
| + | ## JSONデータをパースしてPerlオブジェクトを取り出します。 | ||
| + | my $data = $json-> | ||
| + | |||
| + | ## $dataのプロパティ q に使用する値が入ってます。 | ||
| + | my $q = decode(' | ||
| + | |||
| + | ## $qの値から送り返すデータをPerlオブジェクトで作ります | ||
| + | my $message = sprintf($fmt1, | ||
| + | $message = sprintf($fmt2, | ||
| + | $ans = { | ||
| + | | ||
| + | | ||
| + | }; | ||
| + | }; | ||
| + | if ($@) | ||
| + | { | ||
| + | $ans = { | ||
| + | | ||
| + | | ||
| + | | ||
| + | }; | ||
| + | } | ||
| + | |||
| + | ## JSON形式のレスポンスを返すためのレスポンスヘッダ | ||
| + | print $cgi-> | ||
| + | |||
| + | ## PerlオブジェクトをJSON形式にエンコードしています | ||
| + | print $json-> | ||
| + | </ | ||
| + | |||
| + | ==== その他 ==== | ||
| + | |||
| + | $jsonを以下、 | ||
| + | <code perl> | ||
| + | my $json = JSON-> | ||
| + | </ | ||
| + | |||
| + | の定義とした場合、プロパティ q は以下で取り出す。 | ||
| + | <code perl> | ||
| + | my $q = $data-> | ||
| + | </ | ||
| + | |||
| + | utf8(1)の時はパース時にUTF-8でdecode()が行われPerl内部形式になっているから。 | ||
| + | |||
| + | ===== クライアントサイド ===== | ||
| + | |||
| + | ==== RESTクライアントで確認 ==== | ||
| + | |||
| + | 以下のJSONドキュメントのプロパティqに" | ||
| + | ハッシュ %reply に存在するキーだったため、対応する値が取り出され" | ||
| + | |||
| + | {{documents: | ||
| + | |||
| + | ==== HTML+JavaScriptで確認 ==== | ||
| + | |||
| + | JQueryの$ajaxオブジェクトでURLを呼び出し。なお、Webサーバに配置しないとAjax関係のコードは機能しない。 | ||
| + | |||
| + | {{documents: | ||
| + | |||
| + | HTMLコード。 | ||
| + | |||
| + | <code html sample.html> | ||
| + | < | ||
| + | < | ||
| + | < | ||
| + | < | ||
| + | <meta charset=" | ||
| + | <script type=" | ||
| + | <script type=" | ||
| + | </ | ||
| + | < | ||
| + | < | ||
| + | <div> | ||
| + | 聞いてみる言葉:< | ||
| + | <button type=" | ||
| + | </ | ||
| + | <input type=" | ||
| + | <br/> | ||
| + | </ | ||
| + | < | ||
| + | </ | ||
| + | </ | ||
| + | </ | ||
| + | |||
| + | JavaScriptコード。 | ||
| + | |||
| + | <code js sample.js> | ||
| + | $(function(){ | ||
| + | $('# | ||
| + | var data = { q: $('# | ||
| + | $.ajax({ | ||
| + | url: ' | ||
| + | type: ' | ||
| + | contentType: | ||
| + | data: JSON.stringify(data) | ||
| + | }).done(function(data){ | ||
| + | | ||
| + | }).fail(function(data){ | ||
| + | | ||
| + | | ||
| + | }); | ||
| + | }); | ||
| + | }); | ||
| + | </ | ||
| + | |||
| + | |||
| + | |||
| + | {{tag> | ||
documents/proglang/perl/perl-015.txt · 最終更新: by k896951
