Q. 서울 대전 대구 경기 부산 강원...
그리고 각 도시에 해당되는 지역구... 필요할 때만 호출하고 보고 싶은데
이런거 한 번에 조회할 수 있는 open api 없나?
내가 하나하나 적자니 지역구 명칭이 바뀔 수도 있고
나라에서 공식으로 제공하는 api 뭐 없나...
A. 이런 데이터가 필요했다.
1. SGIS 로그인 https://kosis.kr/oneid/cmmn/login/LoginView.do
2. SGIS 인증키 발급 센터 \ 인증키 신청 \ [약관 동의]
3. 인증키 신청
* 필수 항목만 기재해도 된다.
서비스명 : 웹 개발 공부
사용기간 : 15일
사용목적 : 프로그램 개발용
담당자 : -
연락처 : -
이메일 : -
[요청]
인증키 생성 완료.
SGIS 인증키 발급 센터 \ 나의 인증키
1. 'nodejs_address' 경로 생성
2. VS Code Open Folder… 'nodejs_address'
3. VS Code Terminal 열기
4. Node.js module 설치
nodejs_naverlogin> $ npm init -y
nodejs_naverlogin> $ npm i express nodemon babel node-fetch@2
-- 권한 때문에 안되면
nodejs_naverlogin> $ sudo npm i express nodemon babel node-fetch@2
5. npm run 할 때마다 파일명을 입력하지 않게 package.json에 script 설정 추가
"scripts": {
"dev2": "nodemon 1_api_token.js",
"dev3": "nodemon 2_api_final.js",
1_파일은 token을 제대로 가져오는지 확인.
2_파일은 그 token으로 단계별 주소를 제대로 가져오는지 확인.
1. 1_api_token.js 파일 생성
(1) module 가져오고 express 기능 사용을 위한 app 객체 생성.
const express = require("express");
const fetch = require("node-fetch");
var app = express();
(2) 필요한 데이터 세팅.
서비스 ID = consumer_key
보안 Key = consumer_secret
var consumer_key = "456177c8438e42138910"; // 임의 id
var consumer_secret = "0369e50213345345a01a"; // 임의 secret
var api_url = "";
2. 서비스ID로 인증 token 발급
SGIS 데이터 API \ API 정의 및 예제
const fetch = require("node-fetch");
var express = require("express");
var app = express();
var consumer_key = "456177c8438e42138910"; // 임의 id
var consumer_secret = "0369e50213345345a01a"; // 임의 secret
var api_url = "";
const PORT = 3007; // 3000이든 4000이든 하고 싶은 포트 상관없음.
app.get("/address", async function (req, res) {
api_url =
"https://sgisapi.kostat.go.kr/OpenAPI3/auth/authentication.json?"
+ "consumer_key=" + consumer_key
+ "&consumer_secret=" + consumer_secret;
const response = await fetch(api_url);
// Header에 넣어야하면 api_url, headers: { "key": value } 추가
const tokenRequest = await response.json(); // 그냥은 못 쓰고 json화 필요.
return res.send(tokenRequest);
});
app.listen(PORT, function () {
console.log(`http://127.0.0.1:${PORT}/address app listening on port ${PORT}`);
});
api_url 변수의 문자열 뒤에 안 붙이고,
fetch하면서 (headers는 추가 입력할 때 처럼)
params : { "consumer_key" : consumer_key, "consumer_secret" : consumer_secret} 이렇게
적으면 되지 않을까? 테스트 해봤으나 되지 않았다... swift 때도 안됐던거 같으니
일단 위와 같이 적고 한다.
► 크롬 브라우저 localhost:3007/address 요청
1. 2_api_Final.js 파일 생성
1_api_token.js 파일 소스 복붙.
2. SGIS 데이터 API \ API 정의 및 예제
좌측 바에서 보이는 '단계별 주소 조회'API 를 사용한다.
요청url = https://sgisapi.kostat.go.kr/OpenAPI3/addr/stage.json
3. tokenRequest 변수 아래에 1번 더 fetch를 수행하게 한다.
app.get("/address", async function (req, res) {
api_url =
"https://sgisapi.kostat.go.kr/OpenAPI3/auth/authentication.json?"
+ "consumer_key=" + consumer_key
+ "&consumer_secret=" + consumer_secret;
const response = await fetch(api_url);
// Header에 넣어야하면 api_url, headers: { "key": value } 추가
const tokenRequest = await response.json(); // 그냥은 못 쓰고 json화 필요.
// accessToken으로 단계별 주소 받아오기
if ("result" in tokenRequest) {
const { accessToken } = tokenRequest["result"];
const apiUrl = "https://sgisapi.kostat.go.kr/OpenAPI3/addr/stage.json?"
+ "accessToken=" + accessToken;
const data = await fetch(apiUrl);
// Header에 넣어야하면 api_url, headers: { "key": value } 추가
const addrData = await data.json(); // 그냥은 못 쓰고 json화 필요.
console.log("addrData:", addrData['result']);
}
return res.send("주소 API 출력");
});
위의 소스에서 if문 안에서 선언된 const addrData에만 data를 초기화했기 때문에
블록 밖에서 res.send에는 data를 사용할 수 없다.
if문 블록 밖에서 선언된 지역 변수나 전역global 변수에 초기화하면
res.send나 다른 라우터에서도 사용 가능하다.
► 크롬 브라우저 localhost:3007/address 요청
저 cd 값을 또 parameter로
&cd=11 넘기면
그 지역코드를 가진 지역의 상세 지역구까지 조회할 수 있다.
요청url이 제대로 호출되는지 확인하려면
먼저 postman에서 조회하는 것이 좋다.
GET 요청url만 넣고
Params에 필요한 데이터 입력 후, 'Send' 하면 api 값을 확인 가능하다.
accessToken은 임시 발급이라 accessTimeout 시간이 지나면 만료되어 새로 발급되니
아래와 같이 필요한 데이터 조회 시 사용할 땐 잘 넘겨줘야한다.
상세 지역구 조회를 위해서 cd=11 (서울) 을 파라미터로 넘겨서 조회하면,
addr_name로 확인 가능하다.
'─── Toy Project > Open API, API, 공공데이터' 카테고리의 다른 글
[nodejs] 네이버 로그인 API - token 발급, 프로필 정보 (0) | 2024.10.04 |
---|