1. 만들어야 되는 이유 :
회사 어드민이 회사를 등록 하기전에 회사가 실존하는지 존재 유무를 체크 하기 위해 공공데이터포털에 있는 사업자등록정보 조회 openAPI를 이용하여 검증 후에 등록을 하는 로직을 만들어야 했다.
2. openAPI 사용권한 요청 하기
우선 공공데이터포털에 해당 api 신청은 #2 에 올렸으므로 참고 바랍니다..
3. 구현 하기
로컬서버(스프링) <---> OPENAPI 간 HTTP 통신을 위해 스프링의 WebClient를 이용해보고 싶었지만,, 자료 부족으로
RestTemplate 를 채택하였다.
해당 openApi 주소는
https://api.odcloud.kr/api/nts-businessman/v1/validate?serviceKey='서비스키'
이러하였고 여기에 쿼리파라미터로 신청 후 받은 서비스 키를 저기에 입력하도록 구현만 하면 되는 것이다.
@Value("${API.URL}")
private String BASE_URL;
@Value("${API.SERVICE_KEY}")
private String SERVICE_KEY;
public String searchCompany(CompanySearchRequestDto req) {
RestTemplate restTemplate = new RestTemplate();
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_JSON);
String json = "{\n" +
" \"businesses\": [\n" +
" {\n" +
" \"b_no\": \"" + req.getBusinessNumber() + "\",\n" +
" \"start_dt\": \"" + req.getStartDate() + "\",\n" +
" \"p_nm\": \"" + req.getPrimaryRepresentName1() + "\",\n" +
" \"b_nm\": \"" + req.getBrandName() + "\"\n" +
" }\n" +
" ]\n" +
"}";
HttpEntity<String> entity = new HttpEntity<>(json, headers);
UriComponents uriComponents = UriComponentsBuilder
.fromHttpUrl(BASE_URL)
.queryParam("serviceKey", SERVICE_KEY)
.build();
return restTemplate.postForObject(uriComponents.toUriString(), entity, String.class);
}
이렇게
Uricomponents를 이용해서 백날천날 보내봤지만 항상 답은
"code :-4 msg : 등록되지 않은 인증키 입니다." 였다..
너무 고통스러운 에러였다..
왜냐하면 서비스키안에 특수문자가 있으면 이것이 url상에서는 인코딩이 되어서 다른 형식으로 바뀐다
예로 )
IqDmlasdv+8ecJBIEk0Ov0tKEbpxMaHvl+oXoS4oVObopGNqbqtr1JDzm0WTasdasdRIpqqTEYqLA8LFlrVS48w==
라는 서비스 키가 있다면 '+', '=' 가 인코딩이 되어 %2B, %3D로 바뀌어서 들어간다.
UriComponents uriComponents = UriComponentsBuilder
.fromHttpUrl(BASE_URL)
.queryParam("serviceKey", SERVICE_KEY)
.encode()
.build();
그래서 해당 부분에 인코딩을 추가했는데도 안됐다..
이상하게 특수 문자 '='는 인코딩이 되는데,,, '+'는 안되는 것이였다..
설마해서 공공데이터에서 주는 인코딩 된 키를 하드 코딩해서 넣으면 될까 해서 넣어 보았다.
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_JSON);
headers.setAccept(Collections.singletonList(MediaType.APPLICATION_JSON));
Map<String, Object> body = new HashMap<>();
body.put("businesses", Arrays.asList(req));
HttpEntity<Map<String, Object>> entity = new HttpEntity<>(body,headers);
String url = BASE_URL + "?serviceKey=" + SERVICE_KEY;
URI uri = new URI(url);
//log.info("#######URL : {}", url);
//log.info("#######Body : {}", body);
try {
ResponseEntity<String> response = restTemplate.postForEntity(uri, entity, String.class);
어우 너무 잘된다.
되긴 되는데 이렇게 하드코딩하는게 맞나 싶다..
'Spring > 프로젝트' 카테고리의 다른 글
연차 신청, 관리 시스템 만들기 #10 로그인에 캐시를 써보자 (0) | 2024.07.30 |
---|---|
연차 신청, 관리 시스템 만들기 #9 공공데이터포털 국세청_사업자등록정보 진위확인 및 상태조회 서비스 OpenAPI 이용하기 (Vue (0) | 2024.06.12 |
연차 신청, 관리 시스템 만들기 #7 로그아웃 구현 (1) | 2024.05.29 |
연차 신청, 관리 시스템 만들기 #6 백엔드의 프론트엔드 삽질(Vue3) (0) | 2024.05.22 |
연차 신청, 관리 시스템 만들기 #5 스웨거 만들기 (0) | 2024.05.22 |