'OpenAPI'에 해당되는 글 3건

  1. 2012.02.16 boost.asio로 작성한 http client (1)
  2. 2011.10.12 node.js로 Naver OpenAPI 사용하기
  3. 2011.05.25 [C#] LINQ로 Naver OpenAPI 이용하기 (1)
WinHTTP를 쓰려다가 좌절하고… boost::asio로 작성.
#include "HttpClient.h"
void main()
{
    std::wcout.imbue( std::locale("") );
    AsioHttp::Client client;
    client.Init( "leafbird.net", CP_UTF8 );
    std::wcout << client.Request( "/index.php" ).strData << std::endl;
}

개인 프로젝트에 쓰려고 심플하게 만들었다. 이왕에 asio 사용한 김에 format같은 다른 모듈도 내부에서 사용했음. asio를 한 번도 써 본적도 없고 공부한 적도 없는데, 돌아다니다 보니 http client로 사용하는 예제 코드가 있길래 그냥 그것 기반으로 인터페이스만 정리했다.

http client를 알아볼 때 내가 단골 손님으로 들던 예제가 Naver OpenAPI인데, 이 물건으로 네이버 검색을 하려면 아래처럼 한다.

#include "HttpClient.h"
void main()
{
    std::wcout.imbue( std::locale("") );
    AsioHttp::Client client;
    // call Naver OpenAPI
    client.Init( "openapi.naver.com", CP_UTF8 );
    boost::format fmt( "/search?key=%1%&query=%2%&display..." );
    fmt % "개인 개발자 등록키 값"
        % AsioHttp::ToUrlString( "안철수" );
    std::wcout << client.Request( fmt.str().c_str() ).strData;
}

검색어로 한글을 쓰려고 보니 유의해야 할 점이 하나 있던데, UTF8 인코딩 문자만 받는다는 것. 근데 URL에서의 인코딩 문자 데이터 표기방식이 일반적으로 C++에서 쓰는 바이트 정보랑 다르다. ‘안철수’라는 문자를 UTF8로 인코딩한 후  std::string에 담은 값을 바이트 단위로 다시 ‘%’를 붙여서 문자열화 해야 됨. 바이트 데이터가 0xaa 0xbb 0xcc 0xdd 0xee 0xff라면 ‘%aa%bb%cc%dd%ff’처럼 바꿔야 한다는 말이다. 그래서 ToUrlString(...) 이라는 유틸리티 함수도 같이 만들어 두었다. 궁금한 사람은 직접 코드 열어보시오.

만약에 이 물건으로 C++ 프로젝트에서 AJAX 통신을 하겠다고 한다면, response 데이터의 처리가 문제다. 데이터 형식이 json 아니면 xml이 될 텐데.. 이전 포스팅에서도 설명했듯이 C++에서는 두 포맷 모두 심플하게 다루는 게 쉽지가 않다. 취미로 만드는 게임 엔진에 랭크 기능을 웹서버로 만들어 붙이고 통신할 목적으로 만들었는데… response를 어떻게 처리할지는 좀 더 생각해 봐야지.

See Also:


Posted by leafbird 트랙백 0 : 댓글 1

댓글을 달아 주세요

  1. addr | edit/del | reply Favicon of https://devnote.tistory.com BlogIcon leafbird 2015.01.21 18:37 신고

    gist에 넣었어요. https://gist.github.com/leafbird/db5d0c2826355cc4487c

지난 번에 C# 3.0의 Linq를 이용해 네이버 오픈 API를 호출하는 예제 코드를 올린 적이 있다. ( http://devnote.tistory.com/199 ) 이번에는 node.js의 클라이언트 기능을 이용하여 네이버의 오픈API를 호출해 보았다.
네이버 API는 예제로 사용하기 좋게 심플해서 좋다. 인증 절차도 다른 것 없이 개인 인증키만 파라미터로 같이 넘겨주면 되니까, 결국은 특정 url로 request를 보내고 XML 포맷으로 된 response를 받는게 전부인 셈이다.
요즘은 API의 응답이 json인 경우가 많지만(트위터, 페이스북은 모두 json임), xml을 다루는 일도 많으니 xml을 파싱하는 코드를 알아두는 것도 도움이 된다.

node.js를 웹 클라이언트로 사용하려면 자체 모듈 http만 있으면 된다. 웹소켓까지 사용할 필요도 없다.
xml 포맷을 다루는 것은 기본으로 제공되는 모듈은 없는 듯. 하지만 자바 스크립트 라이브러리는 요즘 널리고 널렸다. 구글링 해보다가 괜찮아 보이는 녀석이 있어서 이것을 사용했다. ( http://www.thomasfrank.se/xml_to_json.html )

2010년 12월호 마이크로소프트웨어에 나온 자료에 보면 node.js를 이용해서 트위터 API를 이용하는 코드가 나오는데, 여기에서 사용한 http.createClient는 지금은 deprecated 되었다. 현재 버전(0.5.9) 기준의 인터페이스로는 http client 객체를 따로 생성할 것없이 http.get 함수만으로 처리 가능하다. (post 방식이 필요한 경우는 http.requst 사용)

   1: http = require( "http" )
   2: sys = require( "util" )
   3: tojson = require( "./xml2json.js" )
   4: fs = require( "fs" )
   5:  
   6: apikey = "…";
   7: query = "검색어";
   8:  
   9: var options = {
  10:   host: 'openapi.naver.com',
  11:   port: 80,
  12:   path: '/search?key='+apikey+'&query='+query+'&display=10&start=1&target=webkr'
  13: };
  14:  
  15: http.get(options, function(response){
  16:         var body = "";
  17:         response.addListener('data', function(chunk)
  18:             {
  19:                 sys.debug("response...");
  20:                 body += chunk;
  21:             });
  22:         response.addListener('end', function()
  23:             {
  24:                 sys.debug("end...");
  25:  
  26:                 jsonObj = xml2json.parser( body );
  27:  
  28:                 for( itemName in jsonObj.rss.channel )
  29:                 {
  30:                     console.log( jsonObj.rss.channel[itemName] );
  31:                 }
  32:  
  33:                 fs.writeFileSync( 'result.txt', JSON.stringify(jsonObj) );
  34:  
  35:             });
  36:     }).on('error', function(e) {
  37:         console.log("Got error: " + e.message);
  38:     });
  39:  

apiKey 변수에 자신의 네이버 API 키값을, query 변수에 검색어를 넣고 실행하면 네이버 웹문서 검색을 한 후 돌려받은 데이터를 xml2json (26 line)을 이용해 json 포맷으로 변경한다.

변경한 데이터 중 실제 검색 데이터 내용 (jsonObj.rss.channel.item)을 콘솔에 출력하고, 리턴받은 결과 전체를 result.txt 파일로 저장한다.

한글을 검색하고 싶을 땐 query 변수에 한글을 그대로 적은 다음, js 파일을 utf-8로 저장하고 실행하면 검색된다.

Posted by leafbird 트랙백 0 : 댓글 0

댓글을 달아 주세요

요즘은 웹 기반의 솔루션들이 오픈 API를 많이 내놓고 있다. 오픈 API를 이용하면 갖가지 인터넷 정보검색은 물론 지도정보를 이용할 수도 있고, 블로그에 글도 올릴 수 있고, 구글 번역을 이용하면 문장 번역도 할 수가 있다. 구글 API는 특히나 방대하다. 아직 자세히 둘러 보지는 않았지만 YouTube도 API가 있고 Picasa, 구글 문서, 구글 캘린더도 다 API를 제공한다. 트위터와 페이스북, 미투데이 같은 SNS들도 오픈 API 형태의 기능제공을 하는 것으로 알고 있다. 앞으로 이런 오픈 API 형태로 접할 수 있는 기능들은 더욱 풍성해질 것이다.

오픈 API의 사용은 간단하다.

  1. http형태로 원하는 데이터를 요청하고,
  2. xml 형태로 요청한 데이터를 받는 것.

이게 전부다. 하지만 문제는 VC++에서는 http로 통신을 하기에도, xml 데이터를 파싱하기에도 자잘한 설정이 너무 많고 복잡하다는 점이다.

C++에서 http 통신을 하려면 WinHttp 계열의 API를 사용하는 것이 가장 기본적이다. 오픈 API 때문이 아니라 예전에 프로젝트에서 다른 작업을 할 때도 잠깐 썼던 적이 있는데, 아 뭐 어찌나 귀찮고 장황한지… 간단하게 사용할 인터페이스는 절대 못 된다.

Functions that create handles

http://msdn.microsoft.com/en-us/library/aa384270(v=VS.85).aspx

 

C++의 xml 파서는 여러 개가 있는데, 그 중에 가장 이름이 많이 알려진 게 MSXML, TinyXml 두 녀석일 듯 하다. 나는 MSXML은 써 본적 없고 TinyXml을 주로 썼는데, 적어도 게임업계 내 주변에서는 다들 TinyXml을 쓰는 거 같다. 하지만 암만 대세인 이 녀석도 아주 마음에 쏙 드는 인터페이스는 아니어서, xml 노드와 속성을 일일이 접근하는 귀찮은 과정이 많이 필요하다. ( http://sourceforge.net/projects/tinyxml/ )

그런데 요즘에 C#이랑 Linq를 공부하다가 OpenAPI 사용하는 코드를 한 번 찾아봤다. (http://chaoskcuf.com/132 )
대략 멍해졌다. C++로 대충 150~200줄 짤 거 같은 API 호출이 열 줄이면 끝난다.

   1: Console.Write("검색할 단어를 입력하세요 : ");
   2: string keyword = Console.ReadLine();
   3:  
   4: string url = "http://openapi.naver.com/search?key={0}&query={1}&target=...";
   5:  
   6: xdoc = XDocument.Load(string.Format(url, _apikey, keyword));
   7:  
   8: var result = from item in xdoc.Descendants("item")
   9:                 select new
  10:                 {
  11:                     Title = item.Element("title").Value,
  12:                     Link = item.Element("link").Value,
  13:                 };
  14:  
  15: int i = 1;
  16: foreach (var searchResult in result)
  17: {
  18:     Console.WriteLine("결과{0} : {1}", i++, searchResult.Title);
  19: }

Linq 문법과 C# 3.0의 Anonymouse Type (익명 타입) 의 엄청난 조화. 대.박.이.다.

Posted by leafbird 트랙백 0 : 댓글 1

댓글을 달아 주세요

  1. addr | edit/del | reply Favicon of https://devnote.tistory.com BlogIcon leafbird 2011.05.26 11:57 신고

    정 C++에서 오픈 API를 사용하고자 한다면, 직접 http 요청하고 xml 받아와 파싱하는 클래스를 만드는거보다 C#에서 처리하고 이걸 dll로 C++에 붙이는게 훨씬 쉽고 빠를 것으로 예상 +_+