リクエスト
HTTPのリクエストは、以下構造で構成されている。
・リクエストライン
・メッセージヘッダ
・改行 ・メッセージボディ
上記は、POSTリクエストの場合。 GETリクエストだと、改行とメッセージボディはない。
また、GETリクエストは、リクエストパラメータはURLの末尾に付加されるが、POSTリクエストは、メッセージボディに格納される。
メッセージヘッダ
名前:値 上記形式を使って、リクエストに関する様々な情報が記載されている。これをヘッダフィールドという。
メッセージボディ
POSTリクエストなら、リクエストパラメータが格納されている。
各リクエスト情報の取得例
@WebServlet(urlPatterns={"/chapter12/request"}) public class Request extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { PrintWriter pw = resp.getWriter(); Page.header(pw); // リクエストURLを取得 pw.println("<p>Request URL<br>" + req.getRequestURL() + "</p>"); // サーバー情報を取得 // 引数にヘッダフィールドの名前を指定すると、ヘッダフィールドの値が返却される pw.println("<p>Host<br>" + req.getHeader("Host") + "</p>"); // ブラウザの種類を取得 pw.println("<p>User-Agent<br>" + req.getHeader("User-Agent") + "</p>"); // リクエスト送信元(クライアント)のIPアドレスを取得 pw.println("<p>Remote Address<br>" + req.getRemoteAddr() + "</p>"); Page.footer(pw); } }
@WebServlet(urlPatterns={"/chapter12/request2"}) public class Request2 extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { PrintWriter pw = resp.getWriter(); Page.header(pw); pw.println("<p>Method<br>" + req.getMethod() + "</p>"); pw.println("<p>Request URI<br>" + req.getRequestURI() + "</p>"); pw.println("<p>Context Path<br>" + req.getContextPath() + "</p>"); pw.println("<p>Servlet Path<br>" + req.getServletPath() + "</p>"); pw.println("<p>Query String<br>" + req.getQueryString() + "</p>"); pw.println("<p>Protocol<br>" + req.getProtocol() + "</p>"); pw.println("<p>Request URL<br>" + req.getRequestURL() + "</p>"); pw.println("<p>Sceme<br>" + req.getScheme() + "</p>"); pw.println("<p>Servlet Name<br>" + req.getServerName() + "</p>"); pw.println("<p>Server Port<br>" + req.getServerPort() + "</p>"); Page.footer(pw); } }
レスポンス
HTTPのレスポンスは、以下構造で構成されている。
・ステータスライン
・メッセージヘッダ
・改行
・メッセージボディ
ステータスライン
HTTPのバージョンとステータスコードが記述される。
主なステータスコード
200・・・正常終了
301・・・リクエストしたリソースは、新しい場所に移動した
302・・・リクエストしたリソースは、一時的に別の場所に移動した
304・・・リクエストしたリソースは変更されていない
404・・・リクエストしたリソースは利用できない
505・・・サーバ側のエラーが原因で、リクエストを完了できない
ステータスコードの範囲
100-199・・・情報
200-299・・・リクエストの成功
300-399・・・リダイレクション
400-499・・・クライアント側のエラー
500-599・・・サーバ側のエラー
メッセージヘッダ
リクエスト同様、ヘッダフィールドがある。
メッセージボディ
出力するHTMLが格納されている。
レスポンスの各種情報の設定例
@WebServlet(urlPatterns={"/chapter12/response"}) public class Response extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { // ステータスコード301を表す定数 resp.setStatus(HttpServletResponse.SC_MOVED_TEMPORARILY); // ヘッダフィールドの指定 resp.setHeader("Location", "http://www.sbcr.jp"); } }