cpprest(又称为Casablanca)是一个开源的C++库,专注于实现现代化、异步的RESTful编程。它提供了一组简洁而强大的API,用于构建客户端和服务器端的HTTP请求和响应,让开发者能够轻松地构建高性能的Web应用程序。本文将详细介绍cpprest库的特性和使用方法,并给出每个请求用法的示例。
客户端
1. 安装和设置
首先,让我们介绍如何安装和设置cpprest库。在这里,我们展示了使用CMake的方式进行设置,以确保兼容不同平台和编译器。
// CMakeLists.txt
cmake_minimum_required(VERSION 3.12)
project(MyCppRestClient)
find_package(cpprestsdk REQUIRED)
add_executable(MyCppRestClient main.cpp)
target_link_libraries(MyCppRestClient PRIVATE cpprestsdk::cpprest)
2. 发送GET请求
下面是一个发送GET请求的示例代码:
#include <cpprest/http_client.h>
#include <cpprest/filestream.h>
using namespace utility;
using namespace web::http;
using namespace web::http::client;
int main()
{
http_client client(U("http://api.example.com"));
// 创建GET请求
uri_builder builder(U("/users"));
http_request request(methods::GET);
request.headers().add("User-Agent", "MyCppRestClient/1.0");
request.set_request_uri(builder.to_uri());
// 发送请求并获取响应
auto response = client.request(request).get();
// 处理响应
if (response.status_code() == status_codes::OK)
{
auto bodyStream = response.body();
concurrency::streams::stringstreambuf strBuffer;
response.body().read_to_end(strBuffer).get();
std::string responseBody = strBuffer.collection();
// 对响应进行处理...
}
else
{
// 处理错误响应...
}
return 0;
}
3. 发送POST请求
下面是一个发送POST请求的示例代码:
#include <cpprest/http_client.h>
#include <cpprest/filestream.h>
using namespace utility;
using namespace web::http;
using namespace web::http::client;
int main()
{
http_client client(U("http://api.example.com"));
// 创建POST请求
uri_builder builder(U("/users"));
http_request request(methods::POST);
request.headers().add("User-Agent", "MyCppRestClient/1.0");
request.set_request_uri(builder.to_uri());
// 设置请求体
json::value requestBody;
requestBody[U("name")] = json::value::string(U("John Doe"));
requestBody[U("age")] = json::value::number(25);
request.set_body(requestBody);
// 发送请求并获取响应
auto response = client.request(request).get();
// 处理响应...
return 0;
}
服务端
1. 安装和设置
首先,让我们介绍如何安装和设置cpprest库。同样,我们使用CMake来进行设置。
// CMakeLists.txt
cmake_minimum_required(VERSION 3.12)
project(MyCppRestServer)
find_package(cpprestsdk REQUIRED)
add_executable(MyCppRestServer main.cpp)
target_link_libraries(MyCppRestServer PRIVATE cpprestsdk::cpprest)
2. 处理GET请求
下面是一个处理GET请求的示例代码:
#include <cpprest/http_listener.h>
#include <iostream>
using namespace web;
using namespace web::http;
using namespace web::http::experimental::listener;
void handle_get(http_request request)
{
// 处理GET请求...
request.reply(status_codes::OK, U("Hello from MyCppRestServer!"));
}
int main()
{
http_listener listener(U("http://localhost:8080"));
// 绑定GET请求处理函数
listener.support(methods::GET, handle_get);
try
{
listener.open().wait();
std::cout << "Server is listening..." << std::endl;
while (true);
}
catch (const std::exception& e)
{
std::cerr << "Error: " << e.what() << std::endl;
}
return 0;
}
3. 处理POST请求
下面是一个处理POST请求的示例代码:
#include <cpprest/http_listener.h>
#include <iostream>
using namespace web;
using namespace web::http;
using namespace web::http::experimental::listener;
void handle_post(http_request request)
{
// 处理POST请求...
json::value requestBody = request.extract_json().get();
// 对请求体进行处理...
request.reply(status_codes::OK, U("Request processed successfully."));
}
int main()
{
http_listener listener(U("http://localhost:8080"));
// 绑定POST请求处理函数
listener.support(methods::POST, handle_post);
try
{
listener.open().wait();
std::cout << "Server is listening..." << std::endl;
while (true);
}
catch (const std::exception& e)
{
std::cerr << "Error: " << e.what() << std::endl;
}
return 0;
}