Spark を使って JSON を返すシンプルな API を書いてみた

公開日: : Java , ,

必要に迫られてモックの API を作成することになった。

大した工数を割けないので使ったことのある Jersey でさらりと作ろうかと考えたが、Javaのマイクロフレームワーク ― この新トレンドは見逃せない | インフラ・ミドルウェア | POSTD を読んで気になっていた Spark をここぞとばかりに使うことにした。

以下はモックを作り始める前に検証した内容のメモ。

目次

1. 検証したこと

「GET でアクセスして JSON を返す API 」を作成したかったので以下を検証した。

  • レスポンスの HTTP ステータスコードの設定
  • レスポンスの Content-Type を application/json に設定
  • レスポンスボディに JSON を埋め込む

また、以下についても確認した。

  • Spark アプリの起動方法

2. 開発環境

Maven を使ってプロジェクトの雛形を作成した。
Java と Maven のバージョンは以下の通り。

$ java -version
java version "1.8.0_45"
Java(TM) SE Runtime Environment (build 1.8.0_45-b14)
Java HotSpot(TM) 64-Bit Server VM (build 25.45-b02, mixed mode)
$ mvn -v
Apache Maven 3.0.5 (r01de14724cdef164cd33c7c8c2fe155faf9602da; 2013-02-19 22:51:28+0900)
Maven home: /usr/local/Cellar/maven30/3.0.5/libexec
Java version: 1.8.0_45, vendor: Oracle Corporation
Java home: /Library/Java/JavaVirtualMachines/jdk1.8.0_45.jdk/Contents/Home/jre
Default locale: ja_JP, platform encoding: US-ASCII
OS name: "mac os x", version: "10.10.5", arch: "x86_64", family: "mac"

3. ソースコード

3-1. Java

リソースクラスのコードは以下の通り。

import static spark.Spark.*;

import javax.ws.rs.core.*;

import com.fasterxml.jackson.databind.*;
import com.google.common.collect.*;

public class SimpleJsonResource {

    public static void main(String[] args) {
        ImmutableMap<String, String> data = ImmutableMap.of("value", "Hello World!"); // ※1

        get("/hello", MediaType.APPLICATION_JSON.toString(), (req, res) -> { // ※2
            res.status(Response.Status.OK.getStatusCode()); // ※3
            res.type(MediaType.APPLICATION_JSON.toString()); // ※2

            ObjectMapper mapper = new ObjectMapper();
            mapper.enable(SerializationFeature.INDENT_OUTPUT); // ※4
            return = mapper.writeValueAsString(data);
        });
    }
}
  • ※1: HashMap を使ってもよかったのだが、ちょっとでも簡単に書きたかったので ImmutableMap を使ってみた
  • ※2: コードに直接 “application/json” と書きたくなかったので使っただけ
  • ※3: こちらも直接 200 と書きたくなかっただけ
  • ※4: インデントしたほうが見やすいので指定しただけ

とてもシンプルに書ける。
モックや単機能の API にはうってつけな感じがする。

3-2. pom.xml

必要そうな部分だけ抜粋した pom.xml の内容は以下の通り。

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">

  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <jackson.version>2.6.1</jackson.version>
  </properties>

  <build>
    <finalName>${project.name}</finalName>

  </build>

  <dependencies>
    <!-- SparkFramework -->
    <dependency>
      <groupId>com.sparkjava</groupId>
      <artifactId>spark-core</artifactId>
      <version>2.2</version>
    </dependency>

    <!-- Jackson -->
    <dependency>
      <groupId>com.fasterxml.jackson.core</groupId>
      <artifactId>jackson-core</artifactId>
      <version>${jackson.version}</version>
    </dependency>
    <dependency>
      <groupId>com.fasterxml.jackson.core</groupId>
      <artifactId>jackson-databind</artifactId>
      <version>${jackson.version}</version>
    </dependency>

    <!-- Google Guava -->
    <dependency>
      <groupId>com.google.guava</groupId>
      <artifactId>guava</artifactId>
      <version>18.0</version>
    </dependency>

    <!-- javax.ws.rs-api -->
    <dependency>
      <groupId>javax.ws.rs</groupId>
      <artifactId>javax.ws.rs-api</artifactId>
      <version>2.0.1</version>
    </dependency>
  </dependencies>
</project>

Java コードの繰り返しになるが javax.ws.rs-api はソースコードに 200 とか “application/json” を書きたくなかったので追加しただけ。

4. アプリの起動方法

pom.xml に “ jar” と定義した Maven プロジェクトにおいて mvn package でプロジェクトの JAR を作成しても、その JAR に参照している外部のライブラリは含まれない。
なので、以下の記事に書いたように maven-shade-plugin プラグインを使うか、今回使ってみた maven-assembly-plugin プラグインを使って外部 JAR も含めた JAR を作る。

maven-assembly-plugin プラグインを使う場合、上記の pom.xml の build タグに以下を追加する。

<plugins>
  <plugin>
    <artifactId>maven-assembly-plugin</artifactId>
    <version>2.2</version>
    <executions>
      <execution>
        <id>make-assembly</id>
        <phase>package</phase>
        <goals>
          <goal>single</goal>
        </goals>
      </execution>
    </executions>
    <configuration>
      <descriptorRefs>
        <descriptorRef>jar-with-dependencies</descriptorRef>
      </descriptorRefs>
      <archive>
        <manifest>
          <mainClass>net.tomoyamkung.sample.SimpleJsonResource</mainClass>
        </manifest>
      </archive>
    </configuration>
  </plugin>
</plugins>

mvn package を実行すると target ディレクトリに SparkFrameworkSample-jar-with-dependencies.jar が作成されるので、この JAR を指定して java コマンドを実行する。

$ mvn clean package
$ java -jar ./target/SparkFrameworkSample-jar-with-dependencies.jar

5. 更新履歴

  • 2015/09/06: 初版作成

Googleアドセンス用(PC)

  • このエントリーをはてなブックマークに追加
  • follow us in feedly

関連記事

medium_182531101

ClassLoader を使って getResourceAsStream で取得したファイルを UTF-8 で読み込む

よく使う割には覚えられず毎回調べている気がするので備忘録としてメモしておきます。 文字コードを指定し

記事を読む

icatch-zip_524574337_mini-thumbnail

Java でファイルが1つだけ圧縮された zip を解凍するサンプル

ファイルが1つだけ圧縮された zip を解凍するサンプルです。 単一ファイルが圧縮された zip

記事を読む

GradleLogoReg

Gradle で Java アプリのプロジェクトを作成して Eclipse にインポートするまでの手順

Mac に SDKMAN! を使って Gradle をインストールしたので、実際にプロジェクトを作成

記事を読む

icatch-thumbnail

レスポンスにサムネイル画像を返す API のサンプル

今回は直接 ImageMagick は関係ありませんが、また画像ネタです。この辺りのことを仕事で扱っ

記事を読む

no image

Java から VBScript を使って Excel を印刷する

背景 Java のデスクトップアプリを作成していたときの要件に「Excel で作成された帳票を印刷

記事を読む

no image

ディレクトリに関するユーティリティ

ディレクトリに関するスニペットをいくつか書いた。いつかコピペする日が来ると思うのでメモしておく。

記事を読む

no image

サーブレットでクラスパス上にあるプロパティファイルを参照するスニペット

よく使うわりにはいつも調べているのでいい加減メモすることにした。 "app.proper

記事を読む

medium_2055608272

指定した年月の日付を Calendar オブジェクトの一覧で取得する

小ワザです。 業務で、指定した年月の日付を Calendar オブジェクトの一覧で取得する必要があり

記事を読む

no image

Google Guava の Function を使った文字列加工の FluentIterable サンプル

お客様の都合上 Java7 で開発している案件があるのだが、Java8 の Function とか

記事を読む

no image

Stream#map()とStream#collect()を使ってListを生成する

Java8 から導入された Stream API も少しずつ慣れてきて、「そういえばこういうパターン

記事を読む

Googleアドセンス用(PC)

Message

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です


八 − 1 =

次のHTML タグと属性が使えます: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

Googleアドセンス用(PC)

icatch-jersey_multi_pathparams
Jerseyの@PathParamはスラッシュの間に複数指定できる

http://hoge-api/user/{id}.{format}

icatch-vagrant_box_customize
VagrantのBoxファイルをカスタマイズして独自のBoxファイルを作成する

配布されている Vagrant の Box ファイルを使って検証環境を

icatch-2015-006-1
バリデーションチェックにJava8のOptionalを使ってスマートに書く(自分比)

Web アプリのバリデーションチェックにアノテーションを使うことが増え

icatch-2015-005-1
ユニットテストの偏りを防ぐ命名規則の付け方

ユニットテスト名に以下の命名規則を付けるようにして二ヶ月ぐらい経った。

icatch-2015-004-1
Vagrantで起動したCentOS上のOctopressをホストOSから確認する設定

タイトルの通りだが、Vagrant を使って起動した CentOS に

→もっと見る

PAGE TOP ↑