cdeclog

C++ REST SDK (casablanca) 간단 샘플 본문

Dev/C++

C++ REST SDK (casablanca) 간단 샘플

디클 2015.02.17 11:03

https://casablanca.codeplex.com/


The C++ REST SDK is a Microsoft project for cloud-based client-server communication in native code using a modern asynchronous C++ API design. This project aims to help C++ developers connect to and interact with services.


What's in the SDK:

  • Features - HTTP client/server, JSON, URI, asynchronous streams, WebSockets client, oAuth
  • PPL Tasks - A powerful model for composing asynchronous operations based on C++ 11 features
  • Platforms - Windows desktop, Windows Store, Windows Phone, Ubuntu, OS X, iOS, and Android
  • Support for Visual Studio 2012, 2013, and 2015 with debugger visualizers
  • NuGet package with binaries for Windows and Android platforms


- Microsoft에서 만든 클라이언트, 서버용 C++ HTTP 통신 모듈이며, JSON URI, 비동기, 웹소켓, oAuth 등을 지원 

- C++11의 비동기, 병렬 프로그램 모델 지원

- 크로스 플랫폼 지원 등..

- XML 파서도 지원 해줬으면 하는 아쉬움이...



# 설치방법

https://casablanca.codeplex.com/documentation

- openssl 및 boost 라이브러리 필요 

- 리눅스(g++)는 소스를 다운 받아 CMake를 이용하여 make 파일 생성, 빌드 및 설치 

  ** 설치시 Release/include/cpprest/details/http_constants.dat 파일이 누락이 되어 수동으로 복사 해줌 (Ubuntu 14.04)

- 윈도우(VC++)는 프로젝트 파일 포함, VS로 열어서 컴파일 하면 됨. 

  그러나 그냥 Nuget 패키지로 설치하면 바이너리와 include 파일을 쉽게 받음.

- 기본적으로 동적 링크(dll, so) 파일로 생성 



# 간단 예제 소스 

- U("") 는 _T("") 와 비슷한, UNICODE 및 MBCS 환경의 문자열 타입을 스위칭 해주는 매크로. 

  허나 U는 _T와는 다르게 _WIN32 환경이면 기본으로 _UTF16_STRINGS으로 정의되어 있어 프로젝트의 문자집합의 세팅과 관계 없이 UNICODE와 같은 환경으로 동작 

  리눅스 환경에서는 다른 설정을 해주지 않는 이상 char, std::string으로 정의 

utility::string_t은 std::string과 std::wstring을 스위칭 해주는 타입 

- 대체적인 패턴은, 동기는 .get(), 비동기는 then().wait() 조합으로 사용



#include <iostream>
using namespace std;
 
#include <cpprest/http_client.h>
#include <cpprest/filestream.h>
 
#pragma comment(lib, "cpprest120_2_4") // windows only
using namespace utility; // Common utilities like string conversions
using namespace web; // Common features like URIs.
using namespace web::http; // Common HTTP functionality
using namespace web::http::client; // HTTP client features
using namespace concurrency::streams; // Asynchronous streams
 
 
void GetHttp()
{
http_client client(U("http://en.cppreference.com/w/"));
auto resp = client.request(U("GET")).get();
 
wcout << U("STATUS : ") << resp.status_code() << endl;
wcout << "content-type : " << resp.headers().content_type() << endl;
wcout << resp.extract_string(true).get() << endl;
}
 
void GetHttpAsync()
{
http_client client(U("http://en.cppreference.com/w/"));
 
client.request(U("GET")).then([](http_response resp){
wcout << U("STATUS : ") << resp.status_code() << endl;
wcout << "content-type : " << resp.headers().content_type() << endl;
 
resp.extract_string(true).then([](string_t sBoby){
wcout << sBoby << endl;
}).wait();
 
}).wait();
 
}
 
 
void GetJson()
{
http_client client(U("http://date.jsontest.com/"));
 
http_request req(methods::GET);
 
client.request(req).then([=](http_response r){
wcout << U("STATUS : ") << r.status_code() << endl;
wcout << "content-type : " << r.headers().content_type() << endl;
 
//{
// "time": "11:25:23 AM",
// "milliseconds_since_epoch" : 1423999523092,
// "date" : "02-15-2015"
//}
 
r.extract_json(true).then([](json::value v) {
wcout << v.at(U("date")).as_string() << endl;
wcout << v.at(U("time")).as_string() << endl;
}).wait();
 
}).wait();
 
}
 
int main(int argc, char* argv[])
{
wcout.imbue(locale("kor")); // windows only
 
GetHttp();
GetHttpAsync();
GetJson();
 
return 0

}



0 Comments
댓글쓰기 폼