深入探索cpprest库:现代化的C++ RESTful编程

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;
}

猜你喜欢

转载自blog.csdn.net/CarryMee/article/details/132149860