Web系開発メモ

Java, C#, HTML, CSS, JavaScript のことなどを書いてます。

Servlet で RESTful API を開発 - 2.Javaコード作成

Servlet で RESTful API を作成する方法を書いていきます。今回の記事では、Java のコードを作成していきます。

連載記事

  1. 概要・プロジェクト作成
  2. Javaコード作成
  3. 動作確認

ユーティリティの作成

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 の作成

URI に応じた Servlet を2つ作成します。

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;
  }
}

次の記事

3. 動作確認