스프링
[스프링] 공공데이터 SERVICE_KEY_IS_NOT_REGISTERED_ERROR 해결
HHRR
2024. 1. 18. 18:04
오류
스프링으로 국토부 건축물대장정보 Open Api를 불러오는데 에러를 마주했다.
인코딩 키를 사용해서 브라우저에서 api 호출하면 잘 불러와지는데, 스프링에서 호출하면 SERVICE_KEY_IS_NOT_REGISTERED_ERROR 에러가 떴다.
<OpenAPI_ServiceResponse>
<cmmMsgHeader>
<errMsg>SERVICE ERROR</errMsg>
<returnAuthMsg>SERVICE_KEY_IS_NOT_REGISTERED_ERROR</returnAuthMsg>
<returnReasonCode>30</returnReasonCode>
</cmmMsgHeader>
</OpenAPI_ServiceResponse>
해결책
1. 서비스키를 디코딩키로 설정 후에 URLEncoder를 사용해서 각 파라미터랑 서비스키를 인코딩해줬다
인코딩 디코딩을 잘하자..
// 각 파라미터를 URLEncoder를 사용하여 인코딩
String encodedSigunguCd = URLEncoder.encode(sigunguCd, StandardCharsets.UTF_8.toString());
String encodedBjdongCd = URLEncoder.encode(bjdongCd, StandardCharsets.UTF_8.toString());
String encodedServiceKey = URLEncoder.encode(serviceKey, StandardCharsets.UTF_8.toString());
2. 이전에는 String으로 uri 지정해줬는데 URI 객체로 생성해줬다.
// URI 생성 (객체로 생성해줘야함!!!!)
URI uri = URI.create(String.format("%s?sigunguCd=%s&bjdongCd=%s&ServiceKey=%s&_type=json",
url, encodedSigunguCd, encodedBjdongCd, encodedServiceKey));
3. 마지막으로 WebClient 호출해주기
// WebClient 호출
String responseBody = webClient.get()
.uri(uri)
.retrieve()
.bodyToMono(String.class)
.block();
전체코드
@GetMapping("/api/{sigunguCd}/{bjdongCd}")
public String callApi(@PathVariable("sigunguCd") String sigunguCd,
@PathVariable("bjdongCd") String bjdongCd) throws IOException {
StringBuilder returnAll = new StringBuilder();
String url = "http://apis.data.go.kr/1613000/BldRgstService_v2/getBrBasisOulnInfo";
// 각 파라미터를 URLEncoder를 사용하여 인코딩
String encodedSigunguCd = URLEncoder.encode(sigunguCd, StandardCharsets.UTF_8.toString());
String encodedBjdongCd = URLEncoder.encode(bjdongCd, StandardCharsets.UTF_8.toString());
String encodedServiceKey = URLEncoder.encode(serviceKey, StandardCharsets.UTF_8.toString());
// URI 생성 (객체로 생성해줘야함!!!!)
URI uri = URI.create(String.format("%s?sigunguCd=%s&bjdongCd=%s&ServiceKey=%s&_type=json",
url, encodedSigunguCd, encodedBjdongCd, encodedServiceKey));
// WebClient 호출
String responseBody = webClient.get()
.uri(uri)
.retrieve()
.bodyToMono(String.class)
.block();
openApiService.init(responseBody);
returnAll.append(responseBody);
return returnAll.toString();
}
오류 해결 스프링에서도 잘 받아와진다!!