データの受け渡しーGETー
はじめに
なんらかのホームページを見たいとき、検索して送信すればホームページが表示されます。
何の変哲もない動作ですが、実はこの数秒間の間に、
1. Webクライアントのアドレスバーに、"http://〇〇〇〇.com" が入力される。 2. Webクライアントは、"〇〇〇〇.com" のIPアドレスを調べる。 3. Webクライアントは、"〇〇〇〇.com" にあるホームページの要求を出す。 4. 要求はインターネットを伝わり、"〇〇〇〇.com" のWebサーバーに到達する。 5. 要求を受け取ったWebサーバーはそのハードディスクからWebページを探す。 6. サーバーはそのWebページを取得し、それをWebクライアントに返す。 7. WebクライアントがWebページを表示する。
という処理が動いています。
このwikiページを閲覧するときにも行われています。
WebクライアントとWebサーバーの間で行われているやり取りについて学んでいきましょう。
Step1: 概念を知る
- HTTP(Hypertext Transfer Protocol)
- WebクライアントとWebサーバー間の、要求(リクエスト)と応答(レスポンス)を制御している通信規格。
- WebクライアントとWebサーバー間通信の約束事(プロトコル)。
- GET(メソッド)
- HTTPのメソッドの一つ。
- ホームページのサーバから情報を取得してくる時に使用する。
- 値をリクエストURLの後に付け加えてサーバに送る。
- 単にGETといったり、GETメソッドと呼ばれることがある。
Step2: 使い方を知る
URL
突然ですが、以下のようなURLを見たことがあるでしょうか?
ログイン用URL(パスワードを入力して専用ページにログインする) https://○○○○.jp/login.php?lang=ja&args=
見たことがないという人は、様々なホームページを閲覧しているときに意識してみましょう。
Webクライアントや設定によっても変わりますが、だいたい画面の上部か左下に表示されています。
どのような構成になっているかと言いますと、
https :// ○○○○.jp / login.php ? lang = ja & args= プロトコル :// ドメイン / 表示ファイル名 ? パラメータ = データ & パラメータ = なし ※わかりやすくするためにスペースを入れています。
となっていて、どのURLもだいたいこのような構成になっています。
今回取り上げる部分は、 ?
以降の パラメータ と データ の部分です。
パラメータ、データ
WebクライアントからWebサーバへ、パラメータにデータを入れて渡すことによって、リクエストを行います。
渡されたデータによってWebサーバは何らかのレスポンスを行います。
ログイン用URLを見ると、 パラメータ = なし
となっている部分がありました。
なし
の部分にデータを入れてパラメータとして渡すと、データに誤りがなければログインが成功します。
https://○○○○.jp/login.php?lang=ja&args=password
パラメータ部分に直接データを入力してリクエストする方法が GET送信 です。
GET送信の注意点
GET送信の方法は、パラメータが明示的というのが特徴です。
そのため以下のようなメリット、デメリットがあります。
- ・メリット
- パラメータを見れば、ページの遷移や、行われている処理がわかる。
- ・デメリット
- パスワードなど個人情報であっても筒抜けになってしまう。
パラメータの取得
パラメータはソースコード上で取り出すことができます。
HttpServletRequestインタフェースの、 requestオブジェクト
を使用してパラメータを読み込みます。
パラメータを読み込むには、 getParameter ()メソッド
を使用します。
String value = request.getParameter("args");
データの受け渡しーPOSTー
はじめに
先ほどはGET送信について学習しました。
GET送信はURLが明示的でわかりやすい反面、
データが誰にでも閲覧可能という注意点がありました。
そんな注意点を考慮したデータの送信方法がPOST送信です。
Step1: 概念を知る
- POST(メソッド)
- HTTPのメソッドの一つで、以下のような特徴があります。
- サーバからの情報取得時に使用
- パラメーター等の値がリクエストURLには表示されず、メッセージボディに格納される
- GET送信よりも多くのデータ量を扱える
- バイナリーデータ(2進数)が送信可能
Step2: 使い方を知る
内容に入る前に、前回の復習です。
https :// ○○○○.jp / login.php ? lang = ja & args= プロトコル :// ドメイン / 表示ファイル名 ? パラメータ = データ & パラメータ = なし ※わかりやすくするためにスペースを入れています。
どのURLもだいたいこのような構成になっているということを学びました。
今回も取り上げる部分は、 ?
以降の パラメータ と データ の部分です。
GET送信の際は、 =
以降に直接値を入力しました。
一方、POST送信はパスワードなど、明示的にすべきでないもののデータの送信を行う際に使用するため、
特にパラメータに対して値を入力するということはありません。
GET送信との違いがわかればここでは問題ありません。
パラメータの取得
パラメータの取得はGET送信の時と同じです。
こちらも前回の復習となります。
String value = request.getParameter("args");
今回はもう1つ学んでいきます。
上記の方法では、1つの引数 ("args")
に対して1つの値を取得しますが、
1つの引数に対して複数の値が送られてくることもあります。
その際に使用するのが getParameterValues
メソッドです。
複数の値が返されるので、配列を宣言しています。
String values[] = request.getParameterValues("args");
【サンプル: チェックボックス】
html/jsp
// スポーツのチェックボックス <form action="送信先" method="post"> <input type="checkbox" name="sports" value="tennis" />テニス <input type="checkbox" name="sports" value="baseball" />野球 <input type="checkbox" name="sports" value="football" />サッカー <input type="checkbox" name="sports" value="basketball" />バスケットボール <input type="checkbox" name="sports" value="table_tennis" />卓球 <input type="submit" value="送信" /> </form>
java
// 各チェックボックスのvalueの値が取得可能です String sports[] = request.getParameterValues("sports");
おまけ
POST送信は、基本的には人の目に見えないところにデータが格納され送信されますが、
リクエストを構成している要素の一つである、メッセージボディに格納されています。
/* リクエストライン */ POST /hoge/ HTTP/1.1 /* リクエストヘッダ */ Host: localhost:○○○○ Connection: keep-alive Content-Length: 22 Cache-Control: max-age=0 Origin: http://localhost:○○○○ Upgrade-Insecure-Requests: 1 User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_4) Chrome/54.0.○○○○.98 Content-Type: application/x-www-form-urlencoded Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8 Referer: http://localhost:○○○○/home/ Accept-Encoding: gzip, deflate, br Accept-Language: ja,en-US;q=0.8,en;q=0.6 /* メッセージボディ */ lang=ja&args=password