Java
jersey
springframework

SpringでRestfulなサーバーとクライアント作ってみた。

ちょこっとAPIというモノを勉強してみた。

サーバー間同士の通信で最近メジャーな通信方式です(らしい。
まぁ、最近はどの大手サービスもAPIを配信してるのでちょこっと勉強。

1時間も勉強してない付け焼刃なんで、編集はガンガン受け付けています!

APIというモノについて

APIはサーバーに対して次のような要求(リクエスト)をする事が出来ます。

メソッド 出来ること
GET リソースの取得
POST   子リソースの作成、リソースへのデータ追加、その他処理
PUT リソースの更新、リソースの作成
DELETE リソースの削除
HEAD リソースのヘッダ (メタデータの取得)
OPTIONS リソースがサポートしているメソッドの取得
TRACE プロキシ動作の確認
CONNECT プロキシ動作のトンネル接続への変更

この中で使うモノは、個人的にはGET POSTしか無さそうですね。業務で知りたい人はもっと調べてみてください。

APIを配信する。

今回は一番簡単なAPI、GETメソッドでJSONを取得するAPIを作成します。

まずはJSONを配信するサービスから。

(もう、SpringMVCのコントローラーの解説はしないですよヾ(。>﹏<。)ノ゙)

APIServiceController.java

import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import com.TsugaruInfo.formmodel.RegisterForm;

@RequestMapping(value = "/APITransport")
@RestController
public class APIServiceController {

    @RequestMapping(value="APIAccessParametors",produces="application/json;charset=UTF-8")
    public String APIAccessParametors() {
        String APIResponseJson = 
            "{\"user\": [\"AtsuAtsuUdon\", \"user\", true],"
            + " \"toot\": [\"アツアツうどんですよろしく!\"]"
            + "CWInfo: {CWSituationIs:[true, \"隠したいなんか\"], \"publicToot\", \"something\"]}";

        return APIResponseJson;
    }
}

見ての通り、文字列を返却しているだけです。
強いてポイントを上げるなら
@RestControllerと、Restfulサービスであることを明記している。
日本語の文字列を配信するので、@RequestMapping
produces="application/json;charset=UTF-8"
と指定している事ですね。

RestClientを作成する。

それではこれをHTTP通信を使って受け取るクライアントを取ってきましょう。
どうやらJavaには標準でのJAX-RS APIというRestサービス、クライアントに関する仕様があり、
その実装として、jerseyという便利ライブラリがあります。

このライブラリももちろんSpring IO Platformでバージョン管理されているので、(わかんない人はggt(ry
さっそく、このライブラリを組み込みましょう。

pom.xml
        <!-- jersey -->
        <dependency>
            <groupId>org.glassfish.jersey.core</groupId>
            <artifactId>jersey-client</artifactId>
        </dependency>
        <dependency>
            <groupId>org.glassfish.jersey.ext</groupId>
            <artifactId>jersey-spring3</artifactId>
        </dependency>

        <!-- Jackson -->
        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-databind</artifactId>
        </dependency>

下のライブラリはJacksonというjsonやxmlのパーサーのライブラリです。受け取ったjsonの文字列をオブジェクトに変換してくれます。

それではさっそくクライアント側を作っていきましょう。

APIRecieverController.java
@RequestMapping(value = "/APITransport")
@Controller
public class APIRecieverController {

    @RequestMapping(value="recieverClient")
    public ModelAndView recieverClient(Model model) {
        ModelAndView mv = new ModelAndView("APIRecieverView");

//HTTP通信設定、URLを指定する
//ポストメソッドならここにリクエストボディをいれる
//HTTPヘッダーも入れる事が出来る
        Client client = ClientBuilder.newClient();
        WebTarget target = client.target("http://localhost:8080")
                .path("/WebAquarium3.1/APITransport/APIAccessParametors");

        String result = "";
//HTTP通信を試みる
            try {
                result = target.request().get(String.class);
            } catch (BadRequestException e) {
                System.out.println("受信に失敗しました><");
                throw e;
            }
//受信したjsonをそのままビューに送る。
//今回はjacksonでラップしない
        mv.addObject("APIMessage", result);
        return mv;
    }
}

基本的にはコメントに書いてある通りです。
1.APIのURLを指定する
2.リクエストを投げる

という手順でAPIを利用します。
最後に、これを表示するビューを作ります。htmlと書いてますが、これはもちろん.jspです

APIRecieverView.html
<%@ page contentType="text/html;charset=UTF-8" pageEncoding="UTF-8" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="sec" uri="http://www.springframework.org/security/tags" %>
<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %>

<head>
<meta content="ja" http-equiv="Content-Language" />
<meta content="text/html; charset=utf-8" http-equiv="Content-Type" />
<title>HTTPReciever</title>

<body>

<p>APIの受信メッセージは</p>
<p>${APIMessage}</p>
<p>です。</p>

</body>

</html>

%APIMessage% で値を受け取るだけ。簡単ですね。
それでは実行してみましょう。

image.png

ちゃんとHTTP通信を利用して、APIを利用する事が出来ました。

まとめ

正直、これ単体ではそこまで派手な事は出来ないです。
OAuth2やSpringSecurityと組み合わせて、認証情報を取得する、となるとかなり強力な機能になってくるんではないでしょうか。(そこまで勉強するのは先になりそうだけど)

ひとまず、HTTP通信をJavaで行う。という基本を押さえた感じの勉強でした。

参考URL
Jersey Client API : Java でWeb API Client を作成する方法
http://www.techscore.com/blog/2016/09/20/jersey-client-api/
Jersey Client で POST
https://qiita.com/noobar/items/a96e07e441241b1e0215