-
[Spring] Maplestory openAPI적용 오류 및 해결과정spring 2024. 2. 1. 17:00반응형
도입
2023년 12월 부터 Nexon사의 콘텐츠에 대한 data가 API형태로 받아볼 수 있게 되었다.
그 중에서 mapleStory의 API를 이용하여 개발을 하고자 하였다.
Spring을 기반으로 하여 개발을 진행하였다.
본문
API를 이용하기 위해서 https://openapi.nexon.com/ 사이트에 로그인하여 애플리케이션 등록을 한 후 API KEY를 발급 받아야한다.
API KEY만 있으면 호출이 가능한 상태가 된다.
예시로 GET /maplestory/v1/id 라는 캐릭터 식별자(ocid) 조회 api가 있다.
이는 캐릭터 식별자(ocid)를 조회해주는 api다.
모든 api 호출에는 Header에 x-nxopen-api-key 라는 이름의 key에 발급 받은 API KEY 값이 들어가 있어야 한다.
캐릭터 식별자조회 api의 경우 추가로 queryparam에 character_name값이 들어오면 식별자 조회가 가능하다.
단, 전체 url은 https://open.api.nexon.com/maplestory/v1/id 가 되기 때문에 이점 유의가 필요하다.
간단하게 postman을 통해 확인하기 위해서 url에 https://open.api.nexon.com/maplestory/v1/id를 넣고 param의 key 값에 character_name value에 조회하고 싶은 캐릭터 닉네임을 적어준다. 그 후 Header설정에서 x-nxopen-api-key를 추가해서 API KEY를 value에 넣어준다. 이러면 반환되는 값으로 {"ocid":"ocid 값"}이 나오게된다.
이를 실제 spring 서버 controller에서 사용하기 위해 다음과 같은 과정을 거쳤다.
1. application.yml 파일 설정
yml 파일에 API KEY값을 저장해 두고 @Value를 사용하여 값을 가져오는 방식을 택했다. 이는 편의성과 보안성 모두를 위한 방법이라 생각한다.
설정 방법은
external:
api:
key: API KEY 값 적기
위와 같이 적으면 된다. 주의점은 들여쓰기와 띄어쓰기에 유의해야 한다.
추가로 yml 파일에서 server:
port: 8080 등의 설정을 통해 port 설정도 바꿀 수있으므로 알아두어야 한다.
2. Controller class 설정
@RestController 가 붙은 Controller class에서 작성한다.
@GetMapping("/maplestory/v1/id")
public ResponseEntity<String> getOcid(@RequestParam String characterName) {
try {
String apiUrl = "https://open.api.nexon.com/maplestory/v1/id";
String fullUrl = UriComponentsBuilder.fromUriString(apiUrl).queryParam("character_name", characterName).build().toUriString();
HttpHeaders headers = new HttpHeaders();
headers.set("x-nxopen-api-key", apiKey);
ResponseEntity<String> responseEntity = new RestTemplate().exchange(fullUrl, HttpMethod.GET, new HttpEntity<>(headers), String.class);
return responseEntity;
} catch (Exception exception) {
return ResponseEntity.status(500).body("에러 발생: " + exception.getMessage());
}
}위의 코드를 보면 엔드포인트는 OpenApI에서 설정한 형식 "/maplestory/v1/id"이다.
닉네임을 인자로 받기 때문에 @RequestParam을 받았다.
그후 API URL 전체 경로를 하드코딩 하였다. 추후 겹치는 경로 부분을 따로 불러와서 조정하는 방법으로 변경할 예정이다.
parm이 적용된 fullUrl로 수정이 된 후 Header에 API Key 값을 적용한다.
그 후 RestTemplate().exchange() 를 사용하여 HTTP 요청을 보내고 응답을 받는다.
이때 나의 경우 유효하지 않은 api key라는 exception이 계속 반환되었다.
이유는 처음에는 new HttpEntity<>(headers) 부분에 null을 넣고 실행하였다. 일반적으로 GET 방식의 경우 null 인 경우가 많지만 header에 있는 key 값이 반드시 필요한 상황이기 때문에 이부분이 null이면 오류가 생기는 것이었다.
이 부분의 오류를 수정하고 실행을 해보면 위에서 설정한 header의 내용이 반영되어 정상적으로 동작함을 확인할 수 있다.
GE
반응형'spring' 카테고리의 다른 글
JMeter를 사용한 API호출 부하 테스트 에러 수정 -2 (1) 2024.02.08 JMeter를 사용한 API호출 부하 테스트 에러 수정 -1 (0) 2024.02.05 [Spring] application.properties/.yml 파일 database 연결 설정 에러 (0) 2024.02.02 PostMan 400에러 badRequest error 발생과 해결과정 (Mysql 예약어 오류) (1) 2024.01.30 Spring InteliJ maven을 gradle로 바꾸는 방법(for mac) (0) 2023.07.13