はじめに
過去記事は「auカブコム証券のkabuステーションREST APIに関する記事一覧」。
swagger-uiが生成したソースは、int型やString型なので、列挙体を定義したが、intValue()などで数値にしているため、せっかくの型チェックが効かない。このため、列挙体を使用したAPIメソッドやモデルクラスを作成する。
APIメソッド
InfoApiのordersGetの定義は以下のようにString型となっている。
public List<OrdersSuccess> ordersGet(
String X_API_KEY, String product, String id, String updtime, String details, String symbol,
String state, String side, String cashmargin) throws ApiException
後から、String productのためにenum ProductCodeを定義したが、メソッドに渡す際にString型にするため、API使用者側がproduct.toString()を呼んでいる。このため、うっかりproduct以外の引数にenum ProductCodeの文字列値を渡すことも、反対に関係のないStringをproductに渡すことが出来てしまう。
このため、InfoApiWrapperクラスを作成し、以下のように列挙体を受け取るようにする。
public List<OrdersSuccess> ordersGet(
String X_API_KEY, ProductCode product, String id, String updtime, String details, String symbol,
StateCode state, SideCode side, CashmarginCode cashmargin) throws ApiException
引数の変更
boardGet(String X_API_KEY, String symbol)はsymbolに[銘柄コード]@[市場コード]の文字列を渡すため、狭義の銘柄コードと市場コードの引数を分ける。
public BoardSuccess boardGet(String X_API_KEY, String symbol, ExchangeCode ec) throws ApiException
リクエストモデルクラス
発注APIのように、多数のパラメータが存在する場合、REST APIにJSONオブジェクトをPOSTすることになり、JSONをマッピングしたモデルクラスを渡す必要がある。このモデルクラスの中の項目を列挙体に変更したいため、モデルクラスのラッパークラスを作成する。
株式の発注ではRequestSendOrderクラスに条件を設定する。
public OrderSuccess sendorderPost(RequestSendOrder body, String X_API_KEY) throws ApiException
これをラップしたSendOrderRequestWrapperクラスを作成し、これを渡すようにする。
public OrderSuccess sendorderPost(SendOrderRequestWrapper req, String password, String X_API_KEY) throws ApiException
ラップしたクラスには、toRequestSendOrder()メソッドを用意し、オリジナルのモデルのインスタンス生成できるようにする。
また、toString()をswaggerが生成したtoString()と同等の文字列を生成させ、ログ出力の際に使えるようにする。
public RequestSendOrder toRequestSendOrder()
共通クラス
RequestSendOrderDerivFutureとRequestSendOrderDerivOptionと異なるクラスだが、中身の項目は同じだったが、ラップしたクラスもSendOrderFutureRequestWrapperとSendOrderOptionRequestWrapperと別々に作成した。
しかし、実装したメソッドがコピペになってしまうので、共通部分をSendOrderDerivRequestWrapperクラスにまとめた。
さらに株式(現物・信用)とデリバティブ(先物・OP)の共通部分をSendOrderCommonRequestWrapperクラスにまとめた。
ただし、ClosePositionにまとめたが、オリジナルは株式用のPositionsと、デリバティブ用のPositionsDerivと、中身の項目は同じだがクラス名が異なるため、両方を生成できるようにする。
レスポンスモデルクラス
リクエストモデルと同様にレスポンスモデルも列挙体をラップしたクラスを作成し、APIがラップクラスを返す。
種別が、株式(現物、信用)、先物、OP、指数によって、項目がnullとなる場合があるため、NPEとならないようにチェックが必要となる。
- BoardSuccessWrapper
- OrdersSuccessWrapper
- PositionsSuccessWrapper
- RegistSuccessWrapper
OrdTypeCode(0)が返る
注文約定情報(OrdersSuccess)の執行条件(OrdType)について、APIリファレンスでは1~6が定義されているが、実際に約定や失効時のレコードが0を返すため、列挙体にZERO(0)を追加する。
追記:列挙体側にnullチェック
特にレスポンスモデルは個別にnullチェックするのが面倒なので、列挙体側がnullチェックする。
文字列を持つ列挙体はvalueOfCode(String code)のため、codeをnullチェックする。
数値を持つ列挙体はvalueOf(int id)のため、Integer idがnullの場合、intに自動変換される際にNPEとなるため、引数をvalueOf(Integer id)に変更して、idをnullチェックする。
githubソース