🕌

JPX J-Quants API for β版をcallしてみる

2023/02/17に公開

はじめに

  • J-QuantsAPIは無償サービスから有償化される予定との事です。
  • SpringBootのStarterProjectを採用して実装しています。
  • HttpClientはRestTemplateを採用しています。

J-QuantsAPIリフレッシュトークン/IDトークンを取得する

エンドポイント:リフレッシュトークン

J-Quantsが公開しているリフレッシュトークン取得APIを呼び出します。

URI

POST //api.jpx-jquants.com/v1/token/auth_user

Parameters

  • Header
    なし
  • Body
    Name
    mailaddress mail@xxxxxx.xxx
    password password
  • Responses
    • 200
    {
      "refreshToken": "<refreshToken>" 
    }
    
    • 400
    {
      "message": "NotAuthorizedException"
    }
    

エンドポイント:IDトークン

J-Quantsが公開しているIDトークン取得APIを呼び出します。

URI

POST //api.jpx-jquants.com/v1/token/auth_refresh

Parameters

  • Header
    なし
  • Body
    Name
    refreshtoken リフレッシュトークン
  • Responses
    • 200
    {
      "idToken": "<idToken>" 
    }
    
    • 400
    {
      "message": "NotAuthorizedException"
    }
    

シーケンス図

株価の情報を取得するためには、IDトークン取得が必要なため、IDトークン取得までのシーケンスを定義する

  1. リフレッシュトークン取得
  2. IDトークン取得

build.gradle

追加したdependenciesはlombokとSpringBootのStarterのみです。

plugins {
  id 'java'
  id 'org.springframework.boot' version '2.7.8'
  id 'io.spring.dependency-management' version '1.0.15.RELEASE'
}
group = 'j-quants-service'
version = '0.0.1'
sourceCompatibility = '11'
dependencies {
  compileOnly 'org.projectlombok:lombok'
  annotationProcessor 'org.projectlombok:lombok'
  implementation 'org.springframework.boot:spring-boot-starter'
  implementation 'org.springframework.boot:spring-boot-starter-web'
  implementation 'org.springframework.boot:spring-boot-starter-jersey'
}

model classの追加

リフレッシュトークン取得API

Request Object

リフレッシュトークン取得APIのRequestObject classを作成する。
J-Quants IFの変数名(property)が同じであれば、RestTemplateが自動でバインドされます。

@Data
@NoArgsConstructor
@AllArgsConstructor
public class RefreshtokenRequest {
  private String mailaddress;
  private String password;
}

Responses Object

リフレッシュトークン取得APIのResponsesObject classを作成する。

@Data
@NoArgsConstructor
@AllArgsConstructor
@JsonIgnoreProperties(ignoreUnknown = true)
public class RefreshtokenResponses {
  private String refreshToken;
}

IDトークン取得API

Request Object

IDトークン取得APIのRequestObject classを作成する。

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

@Data
@NoArgsConstructor
@AllArgsConstructor
public class AuthRefreshRequest {
  private String refreshtoken;
}

Responses Object

IDトークン取得APIのResponsesObject classを作成する

@Data
@NoArgsConstructor
@AllArgsConstructor
@JsonIgnoreProperties(ignoreUnknown = true)
public class AuthRefreshResponses {
  private String idToken;
}

Service classの追加

リフレッシュトークン取得

J-Quantsのリフレッシュトークン取得APIを実行するService classの作成。

@Service
public class RefreshtokenService {
  private static String URL = "https://api.jpx-jquants.com/v1/token/auth_user";
  private static String E_MAIL = "mail@xxxxxx.xxx";
  private static String PASSWORD = "password";

  public RefreshtokenResponses get() {
    RestTemplate restTemplate = new RestTemplate();
    RefreshtokenRequest refreshtokenRequest = new RefreshtokenRequest(E_MAIL, PASSWORD);
    RefreshtokenResponses responses = restTemplate.postForObject(URL, refreshtokenRequest, RefreshtokenResponses.class);
    return responses;
  }
}

IDトークン取得のService class

J-QuantsのIDトークン取得APIを実行するService classの作成。
リフレッシュトークン取得APIで取得したリフレッシュトークンを指定してIDトークン取得APIを実行する。

@Service
public class AuthRefreshService {
  private static final String URL = "https://api.jpx-jquants.com/v1/token/auth_refresh?refreshtoken=";
  public AuthRefreshResponses get(String refreshtoken) {
		RestTemplate restTemplate = new RestTemplate();
		AuthRefreshResponses respons = restTemplate.postForObject(URL.concat(refreshtoken), 
				null, AuthRefreshResponses.class);
    return respons;
  }
}

RestController classの追加

Request URIはGET /api/auth-refreshとする

@RestController
@RequestMapping("api")
public class JQuantsController {
  @RequestMapping(value="auth-refresh", method=RequestMethod.GET)
  public AuthRefreshResponses authRefresh() {
    RefreshtokenResponses refreshtoken = refreshtokenService.get();
    return authRefreshService.get(refreshtoken.getRefreshToken());
  }
}

ExceptionHandler classの追加

Request結果が4XX系や5XX系のHttpStatusが返却された場合にExceptionHandler classで処理するために、ExceptionHandler classを追加します。

model classの追加

Error Request object

@Data
@NoArgsConstructor
@AllArgsConstructor
@JsonIgnoreProperties(ignoreUnknown = true)
public class ErrorResponses {
  private String message;
}

RestControllerAdvice classの追加

全てのRestControllerでHttpStatusCodeExceptionがthrowされた場合に、処理が発動する

@RestControllerAdvice
public class ExceptionController {
  @Autowired
  private ObjectMapper objectMapper;	
  
  @ExceptionHandler(HttpStatusCodeException.class)
  public ErrorResponses httpStatusCodeException(HttpStatusCodeException e) throws IOException {
    return objectMapper.readValue(e.getResponseBodyAsString(), ErrorResponses.class);
  }
}

感想

SpringBootを利用したAPI連携の実装がはじめてだったが、思いのほか詰まることなく実装できた。
参照系(リフレッシュトークン取得API)APIというのものあり、実装量も少なく済んだ。
次回は、銘柄情報APIの公開もあるので、銘柄情報の取得まで実装してみます。

Discussion