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>
...省略...
以上、おつかれさまでした。