LoginSignup
0

posted at

updated at

【kabuslib】auカブコム証券のkabuステーションREST APIを列挙体でラップしたAPI

はじめに

過去記事は「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ソース

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
What you can do with signing up
0