[技術資料室][ネットワーク編]
[SMTP] [ABNF] [RFC]

REST APIつつく

JavaのRESTっぽいものにはJAX-RSなどがあるので、blogの方にメモしていますが、今回はNature RemoのAPIをつついてみたいと思ってみたり。

前提

出てくるものの一覧ですが、全部を把握しているわけではありません。

認証とアクセストークンの取得

アプリケーションを登録する形が多いのですが、APIにアクセスするための権限を持ったアクセストークンをあらかじめ入手します。

REST APIの認証方式の主流はJWT(JSON Web Token)、ユーザ認証はOAuth系(RFC 6750)のアクセストークンを使う方法のようです。たぶん。今回は少し違うので詳細は省略。

Nature Remoの場合はhttps://home.nature.globalから取得できます。Goから進んでいくと認証を経てAccess tokensにたどりつくので Generate access token から新しいaccess tokenを発行します。

再表示はできないのでどこかにメモしておきましょう。Amazon Alexa、Google、iftttなどの名前もあるかもしれません。

公開しないように注意。公開してしまったら削除も可能。

つついてみる

GETメソッドの場合、普通のURLでつついても簡単なのでHttpURLConnection を使ってみます。importなどは不正確。エラー処理などは省略します。私的ライブラリを外してみたサンプル。

import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection
import java.net.URI;

public class RestSample {

    private String accessToken;


    public RestSample(String at) {
       accessToken = ac;
    }


    public String get(URI uri) throws IOException {
        HttpURLConnection conn = (HttpURLConnection) uri.toURL().openConnection();

        conn.setRequestProperty("Accept", "application/json");
        if ( accessToken != null ) {
            conn.setRequestProperty("Authorization", "Bearer " + accessToken);
        }
        conn.connect();
  
        InputStream in = conn.getInputStream();
        byte[] result = new byte[conn.getContentLength()];
   // てぬきなので長いと最後まで読まない(適当に直して
        in.read(result);
        conn.disconnect();

        return new String(result, "utf-8");
    }
}

URI を使っているのは、JAX-RS側にあわせて。

戻り値はString にしてみたがJSONでもいい。

accessToken とURIを使ってアクセスしてみると結果が簡単に取得できる。POSTもほぼ同様にパラメータを追加するくらいで作ることができる。

JAX-RS client版

JAX-RS でもアクセスできるのだがライブラリがどれつかっていいのか不明。Mavenのpom.xml にふたつ追加。

        <dependency>
<groupId>org.glassfish.jersey.core</groupId>
<artifactId>jersey-client</artifactId>
<version>2.29.1</version>
</dependency>
<dependency>
<groupId>org.glassfish.jersey.inject</groupId>
<artifactId>jersey-hk2</artifactId>
<version>2.29.1</version>
</dependency>
import java.net.URI;
import javax.ws.rs.client.Client;
import javax.ws.rs.client.ClientBuilder;
import javax.ws.rs.client.Invocation;

public class RxSample {
    private final String accessToken;

    public RxSample(String at) {
        accessToken = at;
    }

    public String get(URI uri) {
        Client client = ClientBuilder.newClient();
        Invocation.Builder builder = client.target(uri).request("application/json");
        if ( accessTkoen != null ) {
            builder = builder.header("Authorization","Bearer " + accessToken);
        }
        String result = builder.get(String.class);

        return result;
    }

}

connect以下がget() に凝縮されている気がするが、ほかはだいたい同じ。

URIはベースとAPI別の2段階構成にしてもいいのかもしれない。

https://api.nature.global/1/devices をつついて一覧が出てくれば成功。

リモコン本体、テレビ、エアコン、電灯などと赤外線を発進するだけのIRとに分かれる。

/1/appliances/{id}/light に機器IDとボタンをつけてPOSTするか、 /1/signals/{id}/send にボタンIDだけをつけてみるかの違い。

ルールのAPIはないのか?