auカブコム証券のkabuステーションREST APIの残高照会をcurlとjavaで叩く


はじめに

前記事
auカブコム証券のkabuステーションREST APIをcurlで叩く
auカブコム証券のkabuステーションREST APIをjava(generated by the swagger code generator)で叩く

2本の前記事は、REST APIに関する基本的なことで、これだけ知っていれば、だいたいどんなAPIでも使えるはずですが、もうちょっと続けてみます。
今回は、残高照会です。
実際、残高なんて、Webアプリで表示しても、専用Windowsアプリで表示しても、スマホアプリで表示しても、同じ金額なので、わざわざ自作アプリを作る物好きはいないですが、この次に先物OPのGreeks(デルタ、ガンマ、シータ、ベガ)の集計値を表示したいための準備です。

事前準備

前記事2本が動いていれば、本編は5分で終わります。

ツール

変わっていないので省略。

curl

残高照会

QUERY PARAMETERに赤字でrequiredが付いていないので、すべて省略可能です(optional)。
認証TOKENだけHTTPヘッダに指定します。

curl -H "X-API-KEY: %TOKEN%" "http://localhost:18080/kabusapi/positions"

成功するとJSON配列が返ります。

[{"ExecutionID":null,"AccountType":4,...

java

InfoApiTestクラスにpositionsGetTest()があります。
X_API_KEY以外はnullのままでOKです。
実行してみると・・・

[]

0件だった人は、ちゃんと「追記:検証用APIに切り替え方法」の修正までした状態のソースに足した状態で、検証用APIは空しか返りません。

余計な部分を削って、認証+残高照会のみのソースは以下になります。
System.out.println(response);しても、リストを配列のように表示してくれますが、index番号があった方が件数も分かっていいかなと。。。

public class Main {
	private static AuthApi authApi = new AuthApi();
	private static InfoApi infoApi = new InfoApi();
	
	public static void main(String[] args) throws ApiException {
		String token = null;
		{
			RequestToken body = new RequestToken();
	        body.setApIPassword("YourPassword");
	        TokenSuccess response = authApi.tokenPost(body);
	        System.out.println(response);
	        token = response.getToken();
		}
		{
	        String X_API_KEY = token;
	        String product = null;
	        String symbol = null;
	        String side = null;
	        String addinfo = null;
	        List<PositionsSuccess> response = infoApi.positionsGet(X_API_KEY, product, symbol, side, addinfo);

	        // TODO: test validations
	        for (int i = 0; i < response.size(); i++) {
		        System.out.println((i + 1) + ": " + response.get(i));
	        }
		}
	}

}

実行結果

class TokenSuccess {
    resultCode: 0
    token: af3ceea25419422288eb022278b78089
}
1: class PositionsSuccess {
    executionID: null
    accountType: 4
:

おまけ

認証済TOKEN管理クラスを用意すれば、アプリ側にauthApi変数は要らんな。
次回直そうと思ったが、APIと関係ないので、最後にリファクタリングしておく。

AuthorizedTokenクラスを新規に作る。
マルチスレッドを想定していないので、initToken()メソッドを同期していない。
そもそもREST APIがマルチスレッドで呼べるのか知らんし。。。
token == nullのときに認証するが、その後、永遠にTOKENが有効という前提となっている。

public class AuthorizedToken {
	private static AuthorizedToken singleton = new AuthorizedToken();

	public static AuthorizedToken getInstance() {
		return singleton;
	}

	public static String getToken() throws ApiException {
		return singleton.initToken();
	}

	private String token = null;

	private AuthorizedToken() {
	}

	public String initToken() throws ApiException {
		if (token == null) {
			AuthApi authApi = new AuthApi();
			RequestToken body = new RequestToken();
	        body.setApIPassword("YourPassword");
	        TokenSuccess response = authApi.tokenPost(body);
	        System.out.println(response);
	        token = response.getToken();
		}
		return token;
	}

}

残高照会のメインは前半が無くなる。

public class Main {
	private static InfoApi infoApi = new InfoApi();
	
	public static void main(String[] args) throws ApiException {
		{
	        String X_API_KEY = AuthorizedToken.getToken();
	        String product = null;
	        String symbol = null;
	        String side = null;
	        String addinfo = null;
	        List<PositionsSuccess> response = infoApi.positionsGet(X_API_KEY, product, symbol, side, addinfo);

	        // TODO: test validations
	        for (int i = 0; i < response.size(); i++) {
		        System.out.println((i + 1) + ": " + response.get(i));
	        }
		}
	}

}