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
1 2 3 4 5 6 7 8 | @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
1 2 3 4 5 6 7 8 9 10 | ...省略... < 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
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | @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
1 2 3 4 5 6 | <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
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | ...省略... < 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 > ...省略... |
以上、おつかれさまでした。