2021년 신규 작성
C++ REST SDK(cpprestsdk) Sample
--
* 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 onlyusing namespace utility; // Common utilities like string conversionsusing namespace web; // Common features like URIs.using namespace web::http; // Common HTTP functionalityusing namespace web::http::client; // HTTP client featuresusing namespace concurrency::streams; // Asynchronous streamsvoid 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 onlyGetHttp();GetHttpAsync();GetJson();return 0;}
'Dev > C++' 카테고리의 다른 글
cdecl/asb - Http benchmarking and load test tool for windows, posix (0) | 2015.03.18 |
---|---|
Catch (A modern, C++-native, header-only, framework for unit-tests, TDD and BDD) (0) | 2015.02.26 |
[C++11] Variadic template (0) | 2014.11.02 |
boost 설치 (0) | 2013.11.20 |
boost::asio 클라이언트 소켓 (timeout 기능) (0) | 2010.10.14 |