Boost.Asio 활용 방법 중 괜찮을 글이 있어서 원저자의 동의를 받고 소개합니다.




boost.asio로 작성한 http client

http://devnote.tistory.com/226



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를 어떻게 처리할지는 좀 더 생각해 봐야지.

저작자 표시
신고
by 흥배 2013.07.18 08:00
| 1 |

티스토리 툴바