먼저 카사블랑카(Casablanca)를 설치하는 방법은 아래 링크에서 확인 가능합니다.
2015/06/12 - [Programming/C&C++] - C++ REST SDK(Casablanca) 설치 방법
C++ REST SDK를 통해서 간단하게 웹페이지를 가져오는 방법입니다.
먼저 웹페이지를 가져오고 가져온 내용을 html 파일로 기록하기 위해서 다음 헤더를 추가합니다.
#include <cpprest/http_client.h> #include <cpprest/filestream.h>
그리고 using 구문을 추가합니다.
반복적인 코딩을 제거하기 위함입니다.
using namespace utility; using namespace web; using namespace web::http; using namespace web::http::client; using namespace concurrency::streams;
전체적인 소스 코드는 다음과 같습니다.
int main() { auto fileStream = std::make_shared<ostream>(); pplx::task<void> requestTask = fstream::open_ostream(U("result.html")).then([=](ostream outFile) { *fileStream = outFile; http_client_config conf; conf.set_timeout(seconds(5)); http_client client(U("http://www.bing.com/")); uri_builder builder(U("/search")); builder.append_query(U("q"), U("Casablanca CodePlex")); return client.request(methods::GET, builder.to_string()); }).then([=](http_response response) { printf("Receive response status code:%u\n", response.status_code()); return response.body().read_to_end(fileStream->streambuf()); }).then([=](size_t nVal) { printf("Size is %u\n", nVal); return fileStream->close(); }); try { requestTask.wait(); } catch (const std::exception &e) { printf("Error exception:%s\n", e.what()); } return 0; }
먼저 파일 I/O(result.html)를 처리할 shared_ptr를 생성합니다.
다음은 task를 생성하는 부분인데 이 예제의 핵심입니다.
task는 PPL(Parallel Patterns Library)의 기본이 되는 작업단위입니다.
task는 먼저 실행되는 task와 다음에 실행될 task를 연결할 수 있는데 then()으로 가능합니다.
then 내부에서 return이 되면 다음 task가 생성되고 다시 then()으로 연결해서 처리가 가능합니다.
처음에 파일을 생성하면서 task가 생성되고 ostream 타입으로 전달이 됩니다.
첫 번째 then() 내부로 이동하는데 람다 함수로 구성되어 있습니다.
람다에 대한 자세한 설명은 아래 링크에서 확인 가능합니다.
2014/12/11 - [Programming/C++11&14] - [C++11] 이름 없는 함수, 람다(Lambda)(1)
2014/12/11 - [Programming/C++11&14] - [C++11] 이름 없는 함수, 람다(Lambda)(2)
http_client_config 타입의 변수를 생성해서 타임아웃이나 프록시 등을 지정할 수 있습니다.
여기서는 타임아웃 5초가 설정되었습니다.
www.bing.com에서 Casablanca CodePlex라는 키워드로 검색하기 위해서 URI를 구성했습니다.
실제로는 아래와 같은 주소를 쪼개서 입력한 것입니다.
http://www.bing.com/search?q=casablanca%20codeplex
그 이후에 http_client의 request를 호출하고 다음 task가 생성되어 다음 then()으로 이동합니다.
요청에 대한 결과인 http_response가 인자로 전달됩니다.
응답이 200이면 정상적으로 처리된 것이며 응답의 본문(Body)를 파일에 기록하고 return합니다.
마지막은 size_t타입으로 실제 기록된 길이가 전달이 됩니다.
기록된 파일의 길이를 출력하고 파일을 닫아주면 작업이 완료됩니다.
try/catch 구문은 연쇄적인 task들의 예외를 처리하기 위해서 추가되어 있습니다.
requestTask.wait()은 비동기 호출로 인해 main함수가 먼저 종료되는 것을 막기 위해서입니다.
try/catch 이전에 printf() 통해서 출력해보면 task보다 먼저 출력이 되는 것을 확인할 수 있습니다.
이것으로 간단하게 결과를 가져올 수 있습니다.
해당 예제에 대한 상세한 설명은 아래의 링크에서 확인이 가능합니다.
https://casablanca.codeplex.com/wikipage?title=Http%20Client%20Tutorial
'Programming > C&CPP' 카테고리의 다른 글
shared_ptr에서 배열(array) delete[]로 해제하는 방법 (0) | 2015.08.27 |
---|---|
C++ REST SDK(카사블랑카) wstring으로 받는 법 (2) | 2015.06.26 |
C++ REST SDK(Casablanca) 설치 방법 (0) | 2015.06.12 |
wcout, wprintf 등에서 한글 출력 안될 때 해결법 (0) | 2015.01.19 |
얕은 복사(Shallow Copy) vs 깊은 복사(Deep Copy) (0) | 2015.01.14 |