JPX J-Quants API for β版をcallしてみる
はじめに
- 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トークン取得までのシーケンスを定義する
- リフレッシュトークン取得
- 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