@nqounetです。
連載「URL短縮サポーターを作ってみよう」の第3回です。
前回の振り返り
第2回では、タカシさんがURLを入力できるフォームを作成しました。
前回学んだ内容を簡単に振り返ります。
get '/' => 'index';でGETルーティングを定義した__DATA__セクションにEPテンプレートを埋め込んだ<form method="post" action="/shorten">でPOST送信するフォームを作成した
今回は、タカシさんがフォームで「短縮!」ボタンを押したときに、入力されたURLをサーバー側で受け取る処理を実装します。
今回のゴール
第3回では、以下を達成することを目標とします。
- POSTルーティングの仕組みを理解する
$c->param()でフォームから送信されたデータを取得する- 受け取ったURLを画面に表示して動作確認する
送信ボタンを押したらどうなる?
フォーム送信の仕組み
前回作成したフォームには、method="post"とaction="/shorten"という属性を設定しました。この設定により、「短縮!」ボタンを押すとブラウザは以下の動作をします。
- 入力されたデータ(URLテキスト)をリクエストボディに含める
/shortenというパスにPOSTリクエストを送信する
GETリクエストがURLにパラメータを含める(クエリ文字列)のに対し、POSTリクエストはリクエストボディにデータを含めて送信します。そのため、URLが長くなったり、ブラウザの履歴にデータが残ったりすることがありません。
POSTルーティングを定義する
前回、フォームを送信すると「Page not found」エラーが表示されました。これは/shortenへのPOSTリクエストを受け取るルートがまだ定義されていないためです。
Mojolicious::Liteでは、post関数を使ってPOSTルーティングを定義します。GETルーティングのgetと同様に、パスとハンドラを指定するだけで定義できます。
POSTルーティングの実装
コードを追加する
前回作成したapp.plに、POSTルーティングを追加します。get '/' => 'index';の下に以下のコードを追加してください。
| |
コードの各部分を解説します。
POSTルーティングの定義
| |
この部分がPOSTルーティングの定義です。
post '/shorten':/shortenへのPOSTリクエストを処理するルートを定義するsub ($c) { ... }: リクエストを処理する無名サブルーチン。$cはコントローラーオブジェクト$c->param('url'): フォームから送信されたurlという名前のパラメータを取得する$c->render(text => ...): 取得したURLをそのままテキストとして画面に表示する
paramメソッドは、フォームのinput要素に設定したname属性の値をキーとして、送信されたデータを取得します。前回のフォームでは<input name="url" ...>と定義していたので、$c->param('url')で入力値を取得できます。
paramメソッドについて
$c->param()は、Mojoliciousでフォームデータやクエリパラメータを取得する最も基本的なメソッドです。
| |
この1行で、フォームから送信されたURLを変数に格納できます。シンプルですが、非常に強力なメソッドです。
paramメソッドは以下の場所からパラメータを取得できます。
- POSTリクエストのボディ(フォームデータ)
- GETリクエストのクエリ文字列(
?key=value形式) - ルート定義のプレースホルダ(
/:codeのような動的パス)
今回はPOSTリクエストのフォームデータから取得していますが、同じメソッドで様々な入力ソースからデータを取得できることを覚えておいてください。
動作確認
morboで起動する
ファイルを保存したら、morboで起動しているサーバーが自動的にリロードされます。もしサーバーを停止していた場合は、再度以下のコマンドを実行してください。
| |
ブラウザで確認する
http://localhost:3000にアクセスします- テキストボックスに適当なURL(例:
https://example.com/very-long-url)を入力します - 「短縮!」ボタンをクリックします
画面に「受け取ったURL: https://example.com/very-long-url」と表示されれば成功です。
前回はエラーになっていた「短縮!」ボタンが、今回は正しく動作するようになりました。フォームからサーバーにデータを送信し、サーバー側でそのデータを受け取って表示する――Webアプリケーションの基本的なデータの流れが実現できました。
まとめ
今回学んだこと
第3回では、以下のことを学びました。
post '/shorten' => sub ($c) { ... };でPOSTルーティングを定義する方法$c->param('url')でフォームから送信されたデータを取得する方法- GETとPOSTの違い(パラメータの送信方法)
次回予告
次回は「短くするには? — ハッシュで一意のコードを作る」をテーマに、送信されたURLから短縮コードを生成する方法を学びます。Digest::SHAを使ったハッシュ生成で、長いURLから短い識別子を作り出します。お楽しみに。
