使用 C++ REST SDK 进行网络编程
安装 C++ REST SDK
$ brew install cpprestsdk
$ brew install boost
$ brew install libressl
创建工程
打开 Xcode,File / New / Project...
在向导的第1页选 macOS / Command Line Tool
在向导的第2页语言选 C++,Product Name 填上任意名称
在向导的第3页选择任意文件夹,点击 Create 创建工程。
配置工程
将 System Header Search Paths 设置为
/usr/local/Cellar/cpprestsdk/2.10.2/include
/usr/local/Cellar/boost/1.67.0_1/include
/usr/local/Cellar/libressl/2.7.4/include
将 Library Search Paths 设置为
/usr/local/Cellar/cpprestsdk/2.10.2/lib
/usr/local/Cellar/boost/1.67.0_1/lib
/usr/local/Cellar/libressl/2.7.4/lib
将 Other Linker Flags 设置为
-lcpprest -lboost_system -lboost_thread-mt -lboost_chrono-mt -lssl -lcrypto
cpprestsdk: Undefined symbols for architecture x86_64
示例代码1
#include <cpprest/http_client.h>
#include <cpprest/filestream.h>
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
int main(int argc, char* argv[])
{
auto fileStream = std::make_shared<ostream>();
// Open stream to output file.
pplx::task<void> requestTask = fstream::open_ostream(U("results.html")).then([=](ostream outFile) {
*fileStream = outFile;
// Create http_client to send the request.
http_client client(U("http://www.bing.com/"));
// Build request URI and start the request.
uri_builder builder(U("/search"));
builder.append_query(U("q"), U("cpprestsdk github"));
return client.request(methods::GET, builder.to_string());
})
// Handle response headers arriving.
.then([=](http_response response) {
printf("Received response status code:%u\n", response.status_code());
// Write response body into the file.
return response.body().read_to_end(fileStream->streambuf());
})
// Close the file stream.
.then([=](size_t) {
return fileStream->close();
});
// Wait for all the outstanding I/O to complete and handle any exceptions
try {
requestTask.wait();
} catch (const std::exception &e) {
printf("Error exception:%s\n", e.what());
}
return 0;
}
这段代码访问
http://www.bing.com/search?q=cpprestsdk github
将结果保存为 results.html。
JSON : Placeholder
JSON : Placeholder (https://jsonplaceholder.typicode.com/) 是一个用于测试的 REST API 网站。
以下使用 C++ REST SDK 调用该网站的 REST API,获取字符串以及 JSON 数据。
- GET /posts/1
- GET /posts
- POST /posts
- PUT /posts/1
- DELETE /posts/1
所有 GET API 都返回JSON数据,格式(JSON-Schema)如下:
{
"type":"object",
"properties": {
"userId": {"type" : "integer"},
"id": {"type" : "integer"},
"title": {"type" : "string"},
"body": {"type" : "string"}
}
}
示例代码2
#include <cpprest/http_client.h>
#include <cpprest/filestream.h>
#include <cpprest/json.h>
#include <boost/algorithm/string/replace.hpp>
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
using namespace std;
static void print_results(json::value const & value)
{
if(!value.is_null()) {
auto userId = value.at(U("userId")).as_integer();
auto id = value.at(U("id")).as_integer();
auto title = value.at(U("title")).as_string();
auto body = boost::algorithm::replace_all_copy(value.at(U("body")).as_string(), "\n", "\\n");
cout << "Post {userId = " << userId
<< ", id = " << id
<< ", title = \"" << title
<< "\", body = \"" << body
<< "\"}" << endl;
}
}
static void json_get()
{
http_client client(U("https://jsonplaceholder.typicode.com/"));
// Build request URI and start the request.
uri_builder builder(U("posts/1"));
client
// send the HTTP GET request asynchronous
.request(methods::GET, builder.to_string())
// continue when the response is available
.then([](http_response response) -> pplx::task<json::value> {
// if the status is OK extract the body of the response into a JSON value
// works only when the content type is application\json
if(response.status_code() == status_codes::OK) {
return response.extract_json();
}
// return an empty JSON value
return pplx::task_from_result(json::value());
})
// continue when the JSON value is available
.then([](pplx::task<json::value> previousTask) {
// get the JSON value from the task and display content from it
try {
json::value const & v = previousTask.get();
print_results(v);
} catch (http_exception const & e) {
printf("Error exception:%s\n", e.what());
}
})
.wait();
}
static void json_post()
{
http_client client(U("https://jsonplaceholder.typicode.com/"));
json::value json_v ;
json_v["userId"] = json::value::number(101);
json_v["title"] = json::value::string("test title");
json_v["body"] = json::value::string("test body");
client
.request(methods::POST, U("posts"), json_v)
.then([](http_response response) -> pplx::task<string_t> {
if(response.status_code() == status_codes::Created) {
return response.extract_string();
}
return pplx::task_from_result(string_t());
})
.then([](pplx::task<string_t> previousTask) {
try {
string_t const & v = previousTask.get();
cout << v << endl;
} catch (http_exception const & e) {
printf("Error exception:%s\n", e.what());
}
})
.wait();
}
static void json_update()
{
http_client client(U("https://jsonplaceholder.typicode.com/"));
json::value json_v ;
json_v["userId"] = json::value::number(101);
json_v["title"] = json::value::string("test title");
json_v["body"] = json::value::string("test body");
client
.request(methods::PUT, U("posts/1"), json_v)
.then([](http_response response) -> pplx::task<string_t> {
if(response.status_code() == status_codes::OK) {
return response.extract_string();
}
return pplx::task_from_result(string_t());
})
.then([](pplx::task<string_t> previousTask) {
try {
string_t const & v = previousTask.get();
cout << v << endl;
} catch (http_exception const & e) {
printf("Error exception:%s\n", e.what());
}
})
.wait();
}
static void json_delete()
{
http_client client(U("https://jsonplaceholder.typicode.com/"));
client
.request(methods::DEL, U("posts/1"))
.then([](http_response response) -> pplx::task<string_t> {
if(response.status_code() == status_codes::OK) {
return response.extract_string();
}
return pplx::task_from_result(string_t());
})
.then([](pplx::task<string_t> previousTask) {
try {
string_t const & v = previousTask.get();
cout << v << endl;
} catch (http_exception const & e) {
printf("Error exception:%s\n", e.what());
}
})
.wait();
}
int main(int argc, char* argv[])
{
json_get();
json_post();
json_update();
json_delete();
return 0;
}
这段代码调用4个 REST API
然后打印所返回的 JSON 数据以及字符串的内容
Post {userId = 1, id = 1, title = "sunt aut facere repellat provident occaecati excepturi optio reprehenderit", body = "quia et suscipit\nsuscipit recusandae consequuntur expedita et cum\nreprehenderit molestiae ut ut quas totam\nnostrum rerum est autem sunt rem eveniet architecto"}
{
"body": "test body",
"title": "test title",
"userId": 101,
"id": 101
}
{
"body": "test body",
"title": "test title",
"userId": 101,
"id": 1
}
{}
使用 C++ REST SDK 进行网络编程的更多相关文章
- Java Socket网络编程的经典例子(转)
事实上网络编程简单的理解就是两台计算机相互通讯数据而已,对于程序员而言,去掌握一种编程接口并使用一种编程模型相对就会显得简单的多了,Java SDK提供一些相对简单的Api来完成这些工作.Socket ...
- iOS网络编程模型
iOS网络编程层次结构也分为三层: Cocoa层:NSURL,Bonjour,Game Kit,WebKit Core Foundation层:基于 C 的 CFNetwork 和 CFNetServ ...
- 物联网网络编程、Web编程综述
本文是基于嵌入式物联网研发工程师的视觉对网络编程和web编程进行阐述.对于专注J2EE后端服务开发的童鞋们来说,这篇文章可能稍显简单.但是网络编程和web编程对于绝大部分嵌入式物联网工程师来说是一块真 ...
- 有哪些适合学生参与的 C++,网络编程方面的开源项目?
有哪些适合学生参与的 C++,网络编程方面的开源项目? Tinyhttpd是一个超轻量型Http Server,使用C语言开发,全部代码只有502行(包括注释),附带一个简单的Client,可以通 ...
- windows socket 网络编程
样例代码就在我的博客中,包含六个UDP和TCP发送接受的cpp文件,一个基于MFC的局域网聊天小工具project,和此小工具的全部执行时库.资源和执行程序.代码的压缩包位置是http://www.b ...
- 初识Java网络编程
事实上网络编程简单的理解就是两台计算机相互通讯数据而已,对于程序员而言,去掌握一种编程接口并使用一种编程模型相对就会显得简单的多了,Java SDK提供一些相对简单的Api来完成这些工作.Socket ...
- Android开发学习之路--网络编程之初体验
一般手机都是需要上网的,一般我们的浏览器就是个webview.这里简单实现下下功能,先编写Android的layout布局: <?xml version="1.0" enco ...
- 网络编程懒人入门(八):手把手教你写基于TCP的Socket长连接
本文原作者:“水晶虾饺”,原文由“玉刚说”写作平台提供写作赞助,原文版权归“玉刚说”微信公众号所有,即时通讯网收录时有改动. 1.引言 好多小白初次接触即时通讯(比如:IM或者消息推送应用)时,总是不 ...
- Python_socket常见的方法、网络编程的安全注意事项、socketsever模块、浏览器中在一段时间记录用户的登录验证机制
1.socket常见的方法 socket_常见方法_服务器端 import socket from socket import SOL_SOCKET,SO_REUSEADDR sk = socket. ...
随机推荐
- jQuery-3.事件篇---鼠标事件
jQuery鼠标事件之click与dbclick事件 用交互操作中,最简单直接的操作就是点击操作.jQuery提供了两个方法一个是click方法用于监听用户单击操作,另一个方法是dbclick方法用于 ...
- 购物车存到cookie
为什么不存session? 首先,session存在时间限制,会定期清空的,而cookie如果不主动清或者设置定期则不会清楚: session存放在服务器端,cookie存放在客户端浏览器. 购物车存 ...
- CSS3 transform变形(3D转换)
一.三维坐标 空间中三维坐标如下图所示: 向上为-Y,向下为+Y,向左为-X,向右为+X,向前为+Z,向后为-Z. 二.perspective(n)为 3D 转换元素定义透视视图 perspectiv ...
- js 关于定时器的知识点。
Js的同步和异步 同步:代码从上到下执行. 异步:每个模块执行自己的,同时执行. js本身就是同步的,但是需要记住四个地方是异步. Js的异步 1.定时器 2.ajax 3事件的绑定 4. ...
- Google - Reconstruct To Chain
/* 4. 给你一串input,比如: A -> B B -> C X -> Y Z -> X . . . 然后让你设计一个data structure来存这些关系,最后读完了 ...
- R随机森林交叉验证 + 进度条
library(data.table) library(randomForest) data <- iris str(data) #交叉验证,使用rf预测sepal.length k = 5 d ...
- tomcat 端口修改和内存配置
端口号修改参考:https://jingyan.baidu.com/article/adc815139b12def722bf7377.html Tomcat内存溢出(windows) java.lan ...
- django基础 -- 8.cookie 和 session
一. cookie 1.cookie 的原理 工作原理是:浏览器访问服务端,带着一个空的cookie,然后由服务器产生内容, 浏览器收到相应后保存在本地:当浏览器再次访问时,浏览器会自动带上Cooki ...
- requests库(爬虫)
北京理工大学嵩天老师的课程:http://www.icourse163.org/course/BIT-1001870001 官方文档:http://docs.python-requests.org/e ...
- 对中断interrupt的理解
一.中断 线程的几种状态:新建.就绪.运行.阻塞.死亡.参考:线程的几种状态转换 线程的可运行状态并不代表线程一定在运行(runnable != running ) . 大家都知道:所有现代桌面和服务 ...