반응형
(한국투자증권 Open API) EGW00202, GW라우팅 중 오류가 발생했습니다. 해결 방법
KIS Open API를 이용한 해외주식 자동매매 프로그램 개발 중 POST 요청 시 'msg_cd=EGW00202', 'msg1=GW라우팅 중 오류가 발생했습니다.'라는 오류가 발생되었는데요.
정확한 문제 원인은 파악하지 못했지만 아래와 같이 requestDto를 그대로 HttpEntity로 만들어서 전송하던 방식에서 requestDto를 수동으로 직렬화한 String 값을 기반으로 HttpEntity를 만들어 전송하는 방식으로 바꾸니까 오류가 발생하지 않았습니다.
public OrderResponseDto orderToSellStock(String token, String excd, String symb, long ord_qty, BigDecimal ord_unpr) {
final String url = "/uapi/overseas-stock/v1/trading/order";
// HttpHeaders
HttpHeaders headers = new HttpHeaders();
headers.set("content-type", "application/json;charset=UTF-8");
headers.set("authorization", tokenType + token);
headers.set("appkey", appkey);
headers.set("appsecret", appsecret);
headers.set("tr_id", "TTTT1006U"); // TTTT1006U: 미국 매도 주문
// RequestDto
OrderRequestDto requestDto = new OrderRequestDto(cano, acntPrdtCd, Helper.makeFullOvrsExcgCd(excd), symb,
String.valueOf(ord_qty), ord_unpr.toPlainString());
// HttpEntity
HttpEntity<OrderRequestDto> request = new HttpEntity<>(requestDto, headers);
// api 요청
ResponseEntity<OrderResponseDto> response =
restTemplate.exchange(domain + url, HttpMethod.POST, request, OrderResponseDto.class);
// 예외 처리
return response.getBody();
}
오류 발생 코드에서는 다음과 같이 requestDto를 그대로 HttpEntity로 만들어 전송하는 방식을 사용했는데요.
// RequestDto
OrderRequestDto requestDto = new OrderRequestDto(cano, acntPrdtCd, Helper.makeFullOvrsExcgCd(excd), symb,
String.valueOf(ord_qty), ord_unpr.toPlainString());
String bodyContents = "";
try {
bodyContents = objectMapper.writeValueAsString(requestDto);
} catch (Exception e) {
e.printStackTrace();
}
// HttpEntity
HttpEntity<String> request = new HttpEntity<>(bodyContents, headers);
위와 같이 requestDto를 objectMapper를 통해 직접 직렬화 한 다음 String 형태의 body 데이터를 HttpEntity로 만들어 전송하는 방식으로 수정하고 난 뒤 오류가 발생하지 않았습니다.
두 가지 요청의 headers 부분을 살펴보니 직렬화 방식의 차이로 인한 "Content-Length" 값의 차이 외에는 다른 차이점을 찾지 못했는데요.
테스트 중 정확한 문제 원인을 발견하게 되면 추가로 포스팅 내용에 기록하도록 하겠습니다.
반응형