cpprestsdk编译安装linux,使用C++ REST SDK开发简单的Web(HTTP)服务
C++ REST SDK是微軟開源的一套客戶端-服務器通信庫,提供了URI構造/解析,JSON編解碼,HTTP客戶端、HTTP服務端,WebSocket客戶端,流式傳輸,oAuth驗證等C++類,方便C++語言編寫的客戶端程序訪問互聯網服務。其中HTTP服務端相關的類是最近新增的(尚處于beta測試階段),這些類拓展了C++ REST SDK的功能,現在不僅能開發客戶端程序,也能做服務端開發了。
獲取C++ REST SDK:
目前C++ REST SDK源代碼托管在github上,地址為:
https://github.com/Microsoft/cpprestsdk
可以用Git克隆或直接下載zip包
編譯C++ REST SDK:
C++ REST SDK自帶Visual Studio 2013及Visual Studio 2015解決方案文件,使用這兩種IDE直接打開相應的解決方案即可。對于其它平臺,可以用CMake生成該平臺的MakeFile進行編譯。編譯C++ REST SDK還需要Boost和OpenSSL的開發文件,如果CMake提示找不到Boost或OpenSSL,則需要先行下載安裝這幾個庫。
CMake: cmake.org
Boost: www.boost.org
OpenSSL: www.openssl.org
下面是一個簡單的HTTP服務器程序,接收HTTP POST或GET請求,在控制臺上打出請求的方法名,URI和查詢參數,并返回"ACCEPTED"字符串。C++ REST SDK的API相當簡明,無需注解應該可以看懂。#include?
#include?
#include?
#include?
#pragma?comment(lib,?"cpprest_2_7.lib")
#pragma?comment(lib,?"bcrypt.lib")
#pragma?comment(lib,?"crypt32.lib")
#pragma?comment(lib,?"winhttp.lib")
#pragma?comment(lib,?"httpapi.lib")
using?namespace?web;
using?namespace?http;
using?namespace?utility;
using?namespace?http::experimental::listener;
class?CommandHandler
{
public:
CommandHandler()?{}
CommandHandler(utility::string_t?url);
pplx::task?open()?{?return?m_listener.open();?}
pplx::task?close()?{?return?m_listener.close();?}
private:
void?handle_get_or_post(http_request?message);
http_listener?m_listener;
};
CommandHandler::CommandHandler(utility::string_t?url)?:?m_listener(url)
{
m_listener.support(methods::GET,?std::bind(&CommandHandler::handle_get_or_post,?this,?std::placeholders::_1));
m_listener.support(methods::POST,?std::bind(&CommandHandler::handle_get_or_post,?this,?std::placeholders::_1));
}
void?CommandHandler::handle_get_or_post(http_request?message)
{
ucout?<
ucout?<
ucout?<
message.reply(status_codes::OK,?"ACCEPTED");
};
int?main(int?argc,?char?argv[])
{
try
{
utility::string_t?address?=?U("http://*:8080");
uri_builder?uri(address);
auto?addr?=?uri.to_uri().to_string();
CommandHandler?handler(addr);
handler.open().wait();
ucout?<
ucout?<
std::string?line;
std::getline(std::cin,?line);
handler.close().wait();
}
catch?(std::exception&?ex)
{
ucout?<
ucout?<
std::string?line;
std::getline(std::cin,?line);
}
return?0;
}
以上代碼在Visual Studio 2013下,用C++ REST SDK 2.7編譯通過,運行正常,在Linux系統下也可以編譯通過,但是需要鏈接不同的庫,命令行為:
c++ -o restserver -std=c++11 restserver.cpp -lcpprest -lboost_system -lssl -lcrypto
測試服務器是否正常,可以用瀏覽器隨便輸入一個地址,例如http://localhost:8080/test?param=ok
需要注意的是,C++ REST SDK在Windows下,使用Windows系統自帶的WinHTTP/HTTP Server API來實現HTTP協議通信,而在其它平臺下是用Boost ASIO來實現HTTP協議通信,這兩者的實際行為是有區別的,例如:
1.用C++ REST SDK編寫HTTP客戶端,當服務端返回響應碼301/302時,Windows下會用新地址自動重發請求,而Linux下則不會(運行C++ REST SDK自帶的BingRequest示例即可看到這一差異)。
2.用C++ REST SDK編寫HTTP服務端,需要在所有的網絡接口上監聽時,Windows下應使用地址"http://*:8080",而Linux下應使用地址"http://0.0.0.0:8080"。
另外,在Windows下用C++ REST SDK開發HTTP服務時,還有兩個坑需要注意:
第一,由于HTTP Server API自身的一些特性,當C++ REST SDK服務程序在localhost之外的地址上監聽時,默認需要以管理員身份運行程序,如果以普通用戶身份運行上面的小程序,則發生異常:
Exception: Access denied: attempting to add Address 'http://*:8080/'. Run as administrator to listen on an hostname other than localhost, or to listen on port 80.
如果不希望每次都以管理員身份運行,可以用以下命令開放普通用戶的權限:
netsh http add urlacl url=http://*:8080/ user=BUILTIN\Users listen=yes
該命令本身要以管理員身份運行,在Windows 8.1系統下,用Win+X組合鍵打開“命令提示符(管理員)”,輸入命令即可
第二:由于HTTP Server API內部用到了一個內核模塊http.sys,C++ REST SDK服務程序通過Windows防火墻的方式和普通TCP服務程序不太一樣,直接用程序的可執行文件建立防火墻規則是無效的。正確的方式是新建一個入站規則,程序名稱設為system,并設置本地端口為想要監聽的端口號。
總結
以上是生活随笔為你收集整理的cpprestsdk编译安装linux,使用C++ REST SDK开发简单的Web(HTTP)服务的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 查询成绩(要求用链表完成)
- 下一篇: linux 其他常用命令