X

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://.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>
    ...省略...

以上、おつかれさまでした。

mhidaka: Software Engineerだよ。DroidKaigi Organizer / Androidと組込とRe:VIEW。techbooster主宰。mhidaka's writings http://booklog.jp/users/mhidaka 技術書典! http://techbookfest.org