Servlet で RESTful API を作成する方法を書いていきます。今回の記事では、Java のコードを作成していきます。
連載記事
- 概要・プロジェクト作成
- Javaコード作成
- 動作確認
ユーティリティの作成
Jackson Databind を使って、JSON のレスポンスを返すクラスを作成しておきます。
src/main/java/org/sample/servlet/util/Response.java
package org.sample.servlet.util; import com.fasterxml.jackson.databind.ObjectMapper; import jakarta.servlet.http.HttpServletResponse; import java.io.IOException; public class Response { private static final ObjectMapper OM = new ObjectMapper(); public static void json(HttpServletResponse res, Object toJson) throws IOException { res.setContentType("application/json"); res.getWriter().print( OM.writeValueAsString(toJson) ); } }
API の作成
src/main/java/org/sample/servlet/MemoApi.java
package org.sample.servlet; import jakarta.servlet.ServletException; import jakarta.servlet.annotation.WebServlet; import jakarta.servlet.http.HttpServlet; import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; import org.sample.service.MemoService; import org.sample.servlet.util.Response; import java.io.IOException; @WebServlet("/memo") public class MemoApi extends HttpServlet { MemoService service = MemoService.INSTANCE; @Override protected void doGet(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException { Response.json(res, service.findAll()); } @Override protected void doPost(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException { String txt = req.getParameter("txt"); Response.json(res, service.create(txt)); } }
上のクラスは、URI に ID がないリクエストを処理します。
機能 | HTTPメソッド | URI |
---|---|---|
全件参照 | GET | /memo |
作成 | POST | /memo |
下のクラスは、ID のあるリクエストを処理します。
機能 | HTTPメソッド | URI |
---|---|---|
1件参照 | GET | /memo/:id |
更新 | PUT | /memo/:id |
削除 | DELETE | /memo/:id |
src/main/java/org/sample/servlet/MemoIdApi.java
package org.sample.servlet; import jakarta.servlet.ServletException; import jakarta.servlet.annotation.WebServlet; import jakarta.servlet.http.HttpServlet; import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; import org.sample.service.MemoService; import org.sample.servlet.util.Response; import java.io.IOException; @WebServlet("/memo/*") public class MemoIdApi extends HttpServlet { MemoService service = MemoService.INSTANCE; @Override protected void doGet(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException { Long id = getId(req); Response.json(res, service.find(id)); } @Override protected void doPut(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException { Long id = getId(req); String txt = req.getParameter("txt"); Response.json(res, service.update(id, txt)); } @Override protected void doDelete(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException { Long id = getId(req); service.delete(id); res.setStatus(204); } private final int trimIndex = "/memo/".length(); private Long getId(HttpServletRequest req) { String uri = req.getRequestURI(); String strId = uri.substring(trimIndex); return Long.valueOf(strId); } }
※ 異常系の処理は省略しています。
サービスクラス・モデルの作成
今回は Servlet の実装がメインなので、動作確認ができる簡単なクラスを作成しました。
src/main/java/org/sample/service/MemoService.java
package org.sample.service; import org.sample.model.Memo; import java.util.List; public class MemoService { public static final MemoService INSTANCE = new MemoService(); private MemoService() {} public List<Memo> findAll() { return List.of( new Memo(1L, "メモ1"), new Memo(2L, "メモ2") ); } public Memo find(Long id) { return new Memo(id, "メモ"); } public Memo create(String txt) { return new Memo(3L, txt); } public Memo update(Long id, String txt) { return new Memo(id, txt); } public void delete(Long id) { // 実装なし } }
src/main/java/org/sample/model/Memo.java
package org.sample.model; public class Memo { public Long id; public String txt; public Memo(Long id, String txt) { this.id = id; this.txt = txt; } }