본문 바로가기

Programming/C&CPP

C++ REST SDK(카사블랑카)로 웹페이지 가져오기

반응형

먼저 카사블랑카(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

반응형