언어 자료구조 알고리즘/프로그래밍 실습

[C#] 카카오 REST API- 로컬 API, 키워드로 검색

언제나휴일 2018. 11. 21. 14:26
반응형

[C#] 카카오 REST API- 로컬 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();

 

WebResponseGetResponseStream메서드를 호출하여 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);

            }

        }

    }

}


반응형