えらちおごはん

汚ねえメシ画像と学んだことのメモ

REST APIを取得するクライアントをJerseyで作る

Jerseyとは?

Jersey RESTful Web Servicesフレームワークは、JAX-RS APIのサポートを提供し、JAX-RS(JSR 311およびJSR 339)リファレンス実装として機能する、JavaでRESTfulなWebサービスを開発するための、オープンソースで実動品質のフレームワークです。(https://jersey.java.net)

すごく雑に説明すると、REST APIからデータを取得するアプリケーションをJavaで簡単に作るためのライブラリ。労力抑え目でREST APIをどうこうしたい時に便利。

インストール

Mavenを使用する場合は、以下のdependencyを追加する。

<dependency>
  <groupId>com.sun.jersey</groupId>
  <artifactId>jersey-client</artifactId>
  <version>1.19.3</version>
</dependency>

REST APIからデータを取得する

使い方としては、ざっくり以下の3ステップでいける。

  • Clientのインスタンスを生成する
  • Client#resourceでデータを取得する。引数にはAPIのURLを指定する
  • WebResource#getでJSON形式のデータを取り出す

コードに起こすと以下のような感じ。

final Client client = Client.create();
final WebResource resource = client.resource("https://api.github.com/repos/spring-projects/spring-boot/issues");
final String json = resource.get(String.class);

JSONを任意のDTOにデシリアライズする

ここでは、JSONパーサーライブラリのJacksonを使う。
github.com

まずはMavendependencyを追加して、

<dependency>
  <groupId>com.fasterxml.jackson.core</groupId>
  <artifactId>jackson-databind</artifactId>
  <version>2.8.8</version>
</dependency>

任意のDTOを作って*1

@JsonIgnoreProperties(ignoreUnknown=true)
public class GitHubApiResponseDto {
    private String title;
    private String body;

    public String getTitle() {
        return title;
    }
    public void setTitle(String title) {
        this.title = title;
    }
    public String getBody() {
        return body;
    }
    public void setBody(String body) {
        this.body = body;
    }
}

ObjectMapper#readValueすればOK。

final ObjectMapper mapper = new ObjectMapper();
List<GitHubApiResponseDto> results = new ArrayList<GitHubApiResponseDto>();
results = Arrays.asList(mapper.readValue(json, GitHubApiResponseDto[].class));

readValueメソッドはIOException、JsonParseException、JsonMappingExceptionをスローするので、適宜処理してください。

配布用Jarを作る

続いて、jarファイル単品で動作するよう、配布用のjarファイルをビルドする。
こちらも特に複雑なことはなくて、素直にmaven-assembly-pluginを使います。mainClassは各自の環境に応じて書き換えてください。

<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>com.inmotion.Main</mainClass>
          </manifest>
        </archive>
      </configuration>
    </plugin>
  </plugins>
</build>

あとは、mvn packageコマンドを実行してビルド実行。「(プロジェクト名)-jar-with-dependencies.jar」が作成されれば成功です。お疲れ様でした。

リポジトリ

github.com

参考

www.akirakoyasu.net qiita.com

*1:実装の簡略化のため、今回は@JsonIgnoreProperties(ignoreUnknown=true)を指定しています。これを指定しておくと、JSON構造が持つフィールドを全てDTOに用意していなくても動作するようになる