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


ajax 등장 이전부터, ajax, comet, 그리고 html5의 웹소켓까지 기술의 흐름을 간략하게 정리해 보았습니다.

웹 어플리케이션의 개발을 다뤄보지 않은 개발자들을 대상으로 처음부터 웹소켓을 다루기 전에,

  1. 이전 세대의 통신 기법은 어떤 모양이었는지
  2. 웹소켓이 왜 환영받을 만한 기술인지

... 등을 공감할 수 있기 위한 목적으로 PT를 작성 하였습니다.

 
Posted by leafbird 트랙백 0 : 댓글 8

댓글을 달아 주세요

  1. addr | edit/del | reply Favicon of http://blog.naver.com/fantasyls BlogIcon 나진욱 2011.11.18 14:42

    안녕하세요. 웹개발자로 가려는 입문생입니다.
    요즘 새로운 기능들을 한 번 눈여겨 보는 도중에 정말 좋은 강의를 보고 갑니다.'ㅈ')/

    그런데 질문이 있는데요.
    HTML5에 스펙으로 웹소켓이 있는게 아닌걸로 아는데요. 아닌가요?
    저도 책으로 얼핏 본거같아서요.(<- 퍽! 그럼 웹소켓은 어디서 온거냣!)

    아무튼 좋은 글이라서 블로그에 내용 타자로 따로 써서 담아가겠습니다.(출처 밝혀요>ㅁ<)

    쓰다보니 공부도 되네요.^^

    아, 그런데 담아가기가 안 된다면 비밀글로 돌리겠습니다.ㅠ

    • addr | edit/del Favicon of https://devnote.tistory.com BlogIcon leafbird 2011.11.18 15:09 신고

      안녕하세요~
      퍼가시는 것은 괜찮습니다 :)
      그리고 말씀하신대로 웹소켓은 HTML5 스펙에서 제외 되었습니다. (그럼 뭐야?)
      이 발표자료는 저도 HTML5 공부 시작하기 전에 만든 거였는데, 그땐 제외된 줄 모르고 저렇게 적었네요 ^^;

  2. addr | edit/del | reply Favicon of http://blog.naver.com/fantasyls BlogIcon 나진욱 2011.11.18 14:43

    2부가 기대되네요.; - ;)/

    • addr | edit/del Favicon of https://devnote.tistory.com BlogIcon leafbird 2011.11.18 15:10 신고

      2부가 언제 올라오게 될까요 ^^;
      제가 사실 웹 개발자가 아니어서... 웹쪽은 취미삼아 하고 있는거라 후편 일정을 기약할 수가 없습니다 ㅡㅜ...

  3. addr | edit/del | reply Favicon of http://blog.naver.com/fantasyls BlogIcon 나진욱 2011.11.20 17:03

    아하. 그렇군요.
    답변 감사합니다

    ^_^) 취미로 하신다니 그저 기다려야겠네요.ㅎㅎ
    혹시, 2부가 올라오면 다시 즐감하겠습니다.^^
    좋은 하루 되세요.

  4. addr | edit/del | reply 김뭇스 2011.12.03 23:02

    오 예제가 참 적절하십니다.
    ID중복 체크에서 큰 공감을..

  5. addr | edit/del | reply Favicon of http://wnote.kr/wordpress BlogIcon 김성준 2012.02.01 15:31

    설명을 쉽고 간결하게 잘 하시네요. 한번에 쏙쏙 이해가 됩니다.

    이렇게 잘 설명하는 걸 배워야 할텐데, 부럽네요 ^^

요즘은 웹 기반의 솔루션들이 오픈 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++에 붙이는게 훨씬 쉽고 빠를 것으로 예상 +_+