공공데이터포털 (https://www.data.go.kr/) 에서 api를 호출하려고 하는데
계속해서 서비스키가 등록되지 않았다는 에러
가 발생했습니다.
<?xml version="1.0" encoding="UTF-8"?>
<response>
<header>
<resultCode>30</resultCode>
<resultMsg>SERVICE KEY IS NOT REGISTERED ERROR.</resultMsg>
</header>
</response>
만약 계속해서 30번 에러가 발생한다면 2가지 상황을 의심해볼 수 있습니다.
1. api제공 업체의 문제
2. uri 호출 방식의 문제
1. 공공데이터포털에서 제공하는 "미리보기" 조차 불가능한 경우
만약 미리보기조차 불가능하다면 코드의 문제보다는 api 제공업체에 정상적으로 키가 등록되지 않은 경우입니다.
이건 Q&A 문의글을 남겨두면 간단히 해결됩니다.
대신 1~2일의 시간이 요소되기 때문에 다른 코드부터 짜고 계실 것을 추천드립니다.
실제로 저는 미리보기 조차 안되어서 문의글을 남겼더니 다음날 바로 해결해주셨습니다~
홈페이지에서는 1~2시간 걸린다고 되어 있었는데 하루정도 소요됐네요 ㅎㅎ
2. uri 호출 방식의 문제
1) 인코딩 문제
restTemplate.getForObject(uri, String.class)
방식으로 api를 호출할 때,
uri 부분에 String
또는 StringBuilder
데이터타입을 사용하셨나요...?
그럼 안됩니다!
URL에서 특수 문자는 특정 의미를 가지므로, 예를 들어, 공백()은
%20
으로 변환되어야 하는데
String 형식으로 전송하면 공백문자가 %20
로 변환되지 않기 때문입니다~
따라서 URLEncoder
또는 UriComponentsBuilder
를 사용해서 api를 호출해야
"쿼리 파라미터" 부분이 인코딩되어 HTTP 요청이 올바르게 처리됩니다!!
2) 예제코드
package org.dev2ne1.speedalertapi.service;
import lombok.RequiredArgsConstructor;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import org.springframework.web.client.RestTemplate;
import org.springframework.web.util.UriComponentsBuilder;
import java.io.IOException;
import java.net.URI;
@RequiredArgsConstructor
@Service
public class TrafficCameraService {
private final RestTemplate restTemplate;
@Value("${api.key}") // application.properties에서 api.key 값을 읽어옵니다.
private String apiKey;
// API Key 인코딩
String encodedApiKey = URLEncoder.encode(apiKey, StandardCharsets.UTF_8.toString());
// 기본 URL과 파라미터 설정
URI uri = UriComponentsBuilder.fromHttpUrl("http://api.data.go.kr/openapi/tn_pubr_public_unmanned_traffic_camera_api")
.queryParam("serviceKey", encodedApiKey)
.queryParam("pageNo", 1)
.queryParam("numOfRows", 100)
.queryParam("type", "xml")
.queryParam("latitude", latitude) // 위도
.queryParam("longitude", longitude) // 경도
.build(true) // true로 설정하면 자동 인코딩
.toUri();
System.out.println("Request URI: " + uri);
try {
// 요청 실행 및 결과 반환
return restTemplate.getForObject(uri, String.class);
} catch (Exception e) {
// 예외 처리
System.err.println("Error while fetching traffic camera data: " + e.getMessage());
throw new RuntimeException("Failed to fetch traffic camera data", e);
}
}
}
전체 코드 github 링크 :
https://github.com/devfrom2ne1/speedAlertApi.git
GitHub - devfrom2ne1/speedAlertApi: 규정 속도 위반 시, 벌금 금액을 음성 알림으로 내보내는 API서버
규정 속도 위반 시, 벌금 금액을 음성 알림으로 내보내는 API서버. Contribute to devfrom2ne1/speedAlertApi development by creating an account on GitHub.
github.com
'백엔드' 카테고리의 다른 글
맥북 터미널 이름 바꾸기 로컬 사용자 이름 호스트 네임 (0) | 2025.01.12 |
---|---|
Docker 설치하는 방법 공식문서 링크 영어 문서 보는 꿀팁 (1) | 2025.01.08 |
Ubuntu Docker compose 도커컴포즈 설치 이유 설치 방법 (0) | 2024.11.09 |
python 웹 프레임워크로 Fastapi 사용하는 이유 (0) | 2024.08.10 |
[JPA] 대문자로 테이블을 관리하고 싶은데 소문자로 생성된다면? (0) | 2024.05.05 |