스프링

[스프링] 공공데이터 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();
    }

 

오류 해결 스프링에서도 잘 받아와진다!!