[C#] 카카오 REST API- 로컬 API, 키워드로 검색
카카오 API중에 지역 검색에 관한 API는 지도/로컬 API에 있습니다.
이번 글에서는 C#에서 카카오 로컬 API중에 키워드로 장소 검색을 사용하는 예를 알아볼게요.
키워드로 장소 검색에 사용하는 사이트 주소는 다음과 같아요.
string site = "https://dapi.kakao.com/v2/local/search/keyword.json";
사용자가 입력한 검색 질의를 포함한 쿼리 문자열을 만드세요. 쿼리 문자열은 "사이트주소?변수명=값&변수명=값" 형태를 지닙니다. 사이트 주소와 변수 사이에 ?문자로 구분하며 변수명과 값은 =로 구분합니다. 또한 변수와 변수는 &로 구분합니다.
예를 들어 키워드로 장소 검색할 때 검색 질의가 "고기"일 때 쿼리 문자열은 다음과 같아요.
string site = "https://dapi.kakao.com/v2/local/search/keyword.json?query=고기";
이를 반영하면 다음과 같은 코드로 작성할 수 있겠네요.
Console.Write("검색 질의:");
string input = Console.ReadLine();
string site = "https://dapi.kakao.com/v2/local/search/keyword.json";
string query = string.Format("{0}?query={1}", site, input);
REST API를 사용할 때 C#에서는 WebRequest 개체를 통해 서비스를 사용할 수 있어요. 이를 위해 쿼리를 입력 인자로 WebRequest 개체를 생성하세요.
WebRequest request = WebRequest.Create(query);
KaKao REST API를 사용하기 위해서는 WebRequest 개체의 헤더에 인증키를 포함해야 합니다.
string rkey = "[카카오 API에서 발급받은 REST API 키]";
string header = "KakaoAK " + rkey;
request.Headers.Add("Authorization", header);
WebRequest 개체를 통해 서비스를 요청합니다. 이 때 GetResponse 메서드를 호출하며 결과를 확인할 수 있게 WebResponse 개체를 반환하므로 이를 리턴 받습니다.
WebResponse response = request.GetResponse();
WebResponse의 GetResponseStream메서드를 호출하여 Stream 개체를 참조한 후에 UTF8 인코딩 방식으로 StreamReader 개체를 만든 후에 ReadToEnd 메서드를 호출하면 결과 문자열을 확인할 수 있어요.
Stream stream = response.GetResponseStream();
StreamReader reader = new StreamReader(stream, Encoding.UTF8);
String json= reader.ReadToEnd();
stream.Close();
JSON 방식으로 받은 내용을 분석하기 위해 JavaScriptSerializer 개체를 활용할게요. 이를 사용하기 위해서는 System.Web.Extensions 어셈블리를 참조 추가하셔야 합니다.
JavaScriptSerializer js = new JavaScriptSerializer();
런타임에 개체를 확인하여 사용할 수 있는 dynamic을 이용하여 역질렬화합니다.
dynamic dob = js.Deserialize<dynamic>(json);
다음은 KaKao REST API에서 키워드로 장소 검색하였을 때의 결과 예입니다. 컨텐츠에 "meta"와 "documents"부분이 있고 "documents"에 결과 요소들이 []내에 있어요. 그리고 []내에 "place_name", "x","y"등의 정보가 있음을 알 수 있어요.
HTTP/1.1 200 OK Content-Type: application/json;charset=UTF-8 { "meta": { "same_name": { "region": [], "keyword": "카카오프렌즈", "selected_region": "" }, "pageable_count": 14, "total_count": 14, "is_end": true }, "documents": [ { "place_name": "카카오프렌즈 코엑스점", "distance": "418", "place_url": "http://place.map.daum.net/26338954", "category_name": "가정,생활 > 문구,사무용품 > 디자인문구 > 카카오프렌즈", "address_name": "서울 강남구 삼성동 159", "road_address_name": "서울 강남구 영동대로 513", "id": "26338954", "phone": "02-6002-1880", "category_group_code": "", "category_group_name": "", "x": "127.05902969025047", "y": "37.51207412593136" }, ... ] |
여기에서는 "documents"내에 있는 것을 얻어올 것이므로 이 부분을 다시 dynamic 형식 변수에 참조합니다.
dynamic docs = dob["documents"];
docs는 요소의 컬렉션으로 object[]로 변환한 후 원소 개수를 얻어올게요.
object[] buf = docs;
int length = buf.Length;
원소 개수만큼 반복하여 각 원소의 장소이름, x, y 좌표를 얻어와 콘솔 화면에 출력합니다.
for (int i = 0; i < length;i++)
{
string lname = docs[i]["place_name"];
string x = docs[i]["x"];
string y = docs[i]["y"];
Console.WriteLine("{0},{1},{2}", lname, x, y);
}
다음은 전체 소스 코드입니다.
using System;
using System.IO;
using System.Net;
using System.Text;
using System.Web.Script.Serialization;
namespace 카카오_시작
{
class Program
{
static void Main(string[] args)
{
Console.Write("검색 질의:");
string input = Console.ReadLine();
string site = "https://dapi.kakao.com/v2/local/search/keyword.json";
string query = string.Format("{0}?query={1}", site, input);
WebRequest request = WebRequest.Create(query);
string rkey = "[자신의 카카오 REST API 키]";
string header = "KakaoAK " + rkey;
request.Headers.Add("Authorization", header);
WebResponse response = request.GetResponse();
Stream stream = response.GetResponseStream();
StreamReader reader = new StreamReader(stream, Encoding.UTF8);
String json= reader.ReadToEnd();
stream.Close();
JavaScriptSerializer js = new JavaScriptSerializer();
dynamic dob = js.Deserialize<dynamic>(json);
dynamic docs = dob["documents"];
object[] buf = docs;
int length = buf.Length;
for (int i = 0; i < length; i++)
{
string lname = docs[i]["place_name"];
string x = docs[i]["x"];
string y = docs[i]["y"];
Console.WriteLine("{0},{1},{2}", lname, x, y);
}
}
}
}
'언어 자료구조 알고리즘 > 프로그래밍 실습' 카테고리의 다른 글
[C#] 제어문 - 정사각형 출력 (0) | 2019.08.07 |
---|---|
[C#] 제어문 - 삼각형 출력 (0) | 2019.08.07 |
제안서 예 (0) | 2019.03.05 |
[ADO.NET 실습, 포트폴리오] 데이터베이스를 활용한 응용 프로그램 만들기 (0) | 2018.12.26 |
[C#, REST API, 지도 API] 지역 검색으로 얻어온 위도/경도로 지도 설정하는 Windows Forms 응용 프로그램 만들기 (0) | 2018.11.21 |
[KaKao 지도 API] 기본 HTML 소스 코드 + 센터 이동 자바스크립트 함수 (0) | 2018.11.21 |
Visual Studio에서 웹 사이트 만들기 (1) | 2018.11.21 |
[C#, Open API] 지역 검색 후 선택한 지역으로 지도 이동하는 GUI 프로그램 만들기 - 포트폴리오 (0) | 2018.11.21 |
[C#, 윈도우즈 프로그래밍 실습 포트폴리오] MVC 패턴을 적용하여 응용 개발하기 (0) | 2018.11.01 |
[NCS 실습, Windows Form with C#] 화면 구현 - 사용자 정의 컨트롤 및 이벤트 (0) | 2018.10.24 |