GAE:HTTPリクエスト(GET/POST)を処理する
|Google App Engineでは、JavaServlet(サーブレット)を利用して簡単にリクエストを処理できます。サーブレットとはサーバ上でのデータ処理やWebページの動的生成に利用する仕組みで、javax.servletパッケージでは、HTTPプロトコルを扱うためのHttpServletクラスとして実装されています。図の通り、インターフェイスを利用した抽象クラス(HttpServlet)が用意されています。
HTTPリクエスト
HTTPリクエストは、いくつかメソッド(HTTP/1.1 メソッド)が用意されています(以下表)。このなかでも最もよく使うのはサーバ上のリソース取得を要求するGETメソッド、ローカルPC(ブラウザ入力データなど)のリソース転送を要求するPOSTメソッドです。とくにPOSTメソッドはHTTPプロトコルの過去利用の経緯から転送のみならず、リソースの生成や削除など様々な操作が行われています。
HttpServletクラスのメソッド
メソッド | 説明 |
---|---|
doDelete(HttpServletRequest, HttpServletResponse) | リソースの削除を要求する |
doGet(HttpServletRequest, HttpServletResponse ) | リソースの取得を要求する。最もよく使われるHTTPリクエスト |
doHead(HttpServletRequest, HttpServletResponse) | ヘッダ情報のみを要求する |
doOptions(HttpServletRequest, HttpServletResponse) | 通信可能オプション(GetやPostなど)の取得を要求 |
doPost(HttpServletRequest, HttpServletResponse) | リソースの転送(また生成や削除)を要求する。用途が広いリクエスト |
doPut(HttpServletRequest , HttpServletResponse) | リソースの転送を要求する |
doTrace(HttpServletRequest, HttpServletResponse) | ループバック(データのおうむ返し)を要求する |
HTTP/GETメソッド
以下はリソースを取得するHTTP/GETメソッドのサンプルソースコードです。
doGetメソッドの第1引数HttpServletRequest reqはリクエスト内容(入力引数)、第2引数HttpServletResponse respはリクエストに対する応答(出力引数)です。
■src/GuestbookServlet.java
@SuppressWarnings("serial") public class GuestbookServlet extends HttpServlet { public void doGet(HttpServletRequest req, HttpServletResponse resp) throws IOException { resp.setContentType("text/plain"); resp.getWriter().println("Hello, world"); } }
単純にテキスト情報を表示するだけのサーブレットですが、このままではURLとのマッピングがまだ済んでいないため、GuestbookServletを表示することが出来ません。
web.xmlを編集して、URLを割り当てましょう。
■war/WEB-INF/web.xml
...省略... <servlet> <servlet-name>guestbook</servlet-name> <servlet-class>org.jpn.techbooster.sample.guestbook.GuestbookServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>guestbook</servlet-name> <url-pattern>/guestbook</url-pattern> </servlet-mapping> ...省略...
3行目のservlet-name要素と7行目のservlet-name要素を一致させてください。
サンプルコードでは http://<あなたのアプリケーションID>.appspot.com/guestbook にアクセスすることでGuestbookServletから”Hello, world”出力を受け取ることができます。
HTTP/POSTメソッド
doPostメソッドでは、ローカルPCからサーバへのデータ転送に利用する他、サーバ側でのデータ生成や削除などを行える、自由度が非常に高いメソッドです。実はHTTP/1.1にはデータ転送にdoPutメソッド、データ削除はdoDeleteメソッドが用意されています。しかしHTTP/1.1以前の慣例でdoPostメソッドでそれら作業を行っています。
■src/SignGuestbookServlet.java
@SuppressWarnings("serial") public class SignGuestbookServlet extends HttpServlet { public void doPost(HttpServletRequest req, HttpServletResponse resp) throws IOException { String content = req.getParameter("content"); Date date = new Date(); Greeting greeting = new Greeting("ペンギン1号", content, date); PersistenceManager pm = PMF.get().getPersistenceManager(); try { pm.makePersistent(greeting); } finally { pm.close(); } resp.sendRedirect("/guestbook.jsp"); } }
7行目でcontentパラメータを取得し、サーバー側で処理します(今回は掲示板システムのサンプルコードですが、内部処理はまた別記事で取り扱いたいと思います)。
処理が完了した段階(17行目)で、HttpServletResponseクラスのsendRedirectメソッドをつかい、処理をリダイレクトします。
POSTする処理はguestbook.jspに用意して、動的に生成できるようにしています。
■war/guestbook.jsp
<p>きっと何者にもなれないお前たちに告げる!メッセージを書き込むが良い!</p> <form action="/sign" method="post"> <div><textarea name="content" rows="3" cols="60"></textarea></div> <div><input type="submit" value="生存戦略する" /></div> </form> <p>-----生存戦略しましょうか。</p>
3行目のcontentパラメータはSignGuestbookServlet.javaの3行目String contentで取得したパラメータです。
URLとサーブレットを割り当てるweb.xmlはGETメソッドのときと同様に設定します。
■war/WEB-INF/web.xml
...省略... <servlet> <servlet-name>sign</servlet-name> <servlet-class>org.jpn.techbooster.sample.guestbook.SignGuestbookServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>sign</servlet-name> <url-pattern>/sign</url-pattern> </servlet-mapping> <welcome-file-list> <welcome-file>guestbook.jsp</welcome-file> </welcome-file-list> ...省略...
以上、おつかれさまでした。