学懂C++(四十二):网络编程——RESTful API:概念、原理、核心点与 C++ 实现详解

本文主要是介绍学懂C++(四十二):网络编程——RESTful API:概念、原理、核心点与 C++ 实现详解,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

目录

一、引言

二、RESTful 概念

1. 什么是 REST

2. RESTful API 概念

三、RESTful 与 HTTP 的联系与区别

1. 资源与 URL

2. HTTP 方法的使用

3. 无状态性

四、RESTful API 的核心原则

1. 资源标识(Resource Identification)

2. 表征(Representations)

3. 自描述消息(Self-Descriptive Messages)

4. 超媒体作为应用状态的引擎(HATEOAS)

五、在 C++ 中实现 RESTful API

1. 准备工作

2. 示例代码

服务器代码

代码解析

3. 运行代码

在 Linux 上

在 Windows 上

六、测试 RESTful API

七、总结


一、引言

        在现代 Web 开发中,RESTful API 是一种广泛使用的架构风格,为客户端和服务器之间的通信提供了一种高效、简洁的方式。RESTful API 以其简洁、轻量、易于理解和维护的特点,成为了构建 Web 服务的首选方法之一。

        什么是RESTful?与常用的HTTP有什么不同?C++可以实现RESTful吗?本文将深入解析 RESTful 的概念、原理以及其与常用 HTTP 的联系与区别,并详细介绍如何在 C++ 中实现 RESTful API。

二、RESTful 概念

1. 什么是 REST

REST(Representational State Transfer,表征状态转移)是由 Roy Fielding 在其 2000 年的博士论文中首次提出的一种架构风格。REST 是一种设计原则和约束条件的集合,它定义了一种基于 HTTP 协议的轻量级 Web 服务接口。

2. RESTful API 概念

RESTful API 是遵循 REST 原则来设计和实现的 Web API。它通过使用标准的 HTTP 方法(如 GET、POST、PUT、DELETE 等)对资源进行操作,每个 URL 表示一个资源。

三、RESTful 与 HTTP 的联系与区别

RESTful API 本质上是基于 HTTP 协议的,因此它们之间有许多相似之处。以下是 RESTful API 与常用 HTTP 的联系与区别:

1. 资源与 URL
  • RESTful:每个 URL 代表一种资源,URL 中不包含动词,资源的状态通过 HTTP 方法来操作。
  • HTTP:通常的 HTTP 请求可能包含动词,如 http://example.com/getUser
2. HTTP 方法的使用
  • RESTful:严格使用 HTTP 方法来定义操作:

    • GET:获取资源
    • POST:创建资源
    • PUT:更新资源
    • DELETE:删除资源
  • HTTP:常规的 HTTP 使用中,方法的使用可能不那么严格,并且可以通过 URL 包含动词来表示操作。

3. 无状态性
  • RESTful:每个请求都是独立的,服务器不保存客户端的状态。所有状态信息由客户端传递。
  • HTTP:HTTP 本身也是无状态的,但在实际应用中可以通过会话和 Cookie 来维护状态。

四、RESTful API 的核心原则

1. 资源标识(Resource Identification)

每个资源通过 URL 唯一标识。例如:

http://example.com/users/123

表示 ID 为 123 的用户资源。

2. 表征(Representations)

资源的表征可以是 JSON、XML 等格式。客户端和服务器通过表征来交换资源状态。

3. 自描述消息(Self-Descriptive Messages)

每个请求包含所需的信息以理解请求和响应的处理方式。例如,使用 HTTP 头部信息来表示内容类型(Content-Type)。

4. 超媒体作为应用状态的引擎(HATEOAS)

客户端通过获取的资源中的链接(hypermedia links)来导航应用状态。

五、在 C++ 中实现 RESTful API

在 C++ 中实现 RESTful API,可以使用多种库,如 Pistachecpp-httplibBoost.Beast 等。本文将使用 cpp-httplib 库来实现一个简单的 RESTful API。

1. 准备工作

首先,确保你已经安装并配置了 cpp-httplib 库。可以从 cpp-httplib GitHub 获取最新版本并进行编译安装。

2. 示例代码

以下是一个使用 cpp-httplib 实现的 RESTful API 示例,提供了对用户资源的基本操作(CRUD)。

服务器代码
#include <httplib.h>
#include <nlohmann/json.hpp>
#include <iostream>
#include <unordered_map>// 使用 nlohmann::json 进行 JSON 解析和生成
using json = nlohmann::json;
using namespace httplib;// 用户结构体
struct User {int id;std::string name;
};// 全局用户存储
std::unordered_map<int, User> users;// 获取所有用户
void get_users(const Request& req, Response& res) {json j = json::array();for (const auto& [id, user] : users) {j.push_back({{"id", user.id}, {"name", user.name}});}res.set_content(j.dump(), "application/json");
}// 获取特定用户
void get_user(const Request& req, Response& res) {int user_id = std::stoi(req.matches[1].str());if (users.find(user_id) != users.end()) {json j = {{"id", users[user_id].id}, {"name", users[user_id].name}};res.set_content(j.dump(), "application/json");} else {res.status = 404;res.set_content("User not found", "text/plain");}
}// 创建用户
void create_user(const Request& req, Response& res) {auto j = json::parse(req.body);int id = j["id"];std::string name = j["name"];users[id] = User{id, name};res.status = 201;res.set_content("User created", "text/plain");
}// 更新用户
void update_user(const Request& req, Response& res) {int user_id = std::stoi(req.matches[1].str());if (users.find(user_id) != users.end()) {auto j = json::parse(req.body);users[user_id].name = j["name"];res.set_content("User updated", "text/plain");} else {res.status = 404;res.set_content("User not found", "text/plain");}
}// 删除用户
void delete_user(const Request& req, Response& res) {int user_id = std::stoi(req.matches[1].str());if (users.find(user_id) != users.end()) {users.erase(user_id);res.set_content("User deleted", "text/plain");} else {res.status = 404;res.set_content("User not found", "text/plain");}
}int main() {Server svr;// 处理 GET /users 请求svr.Get("/users", get_users);// 处理 GET /users/:id 请求svr.Get(R"(/users/(\d+))", get_user);// 处理 POST /users 请求svr.Post("/users", create_user);// 处理 PUT /users/:id 请求svr.Put(R"(/users/(\d+))", update_user);// 处理 DELETE /users/:id 请求svr.Delete(R"(/users/(\d+))", delete_user);// 启动服务器svr.listen("0.0.0.0", 8080);return 0;
}
代码解析
  1. 依赖库httplib.h 用于处理 HTTP 请求和响应,nlohmann/json.hpp 用于 JSON 解析和生成。
  2. 用户结构体:定义用户结构体 User,包含用户 ID 和姓名。
  3. 全局用户存储:使用 std::unordered_map 存储用户信息。
  4. 路由与处理函数:定义多个处理函数来响应不同的 HTTP 请求:
    • get_users:处理 GET /users 请求,返回所有用户。
    • get_user:处理 GET /users/:id 请求,返回特定用户。
    • create_user:处理 POST /users 请求,创建新用户。
    • update_user:处理 PUT /users/:id 请求,更新特定用户。
    • delete_user:处理 DELETE /users/:id 请求,删除特定用户。
  5. 启动服务器:使用 svr.listen 方法启动 HTTP 服务器,监听端口 8080。
3. 运行代码
在 Linux 上

假设将代码保存为 rest_server.cpp,使用以下命令编译和运行:

# 编译代码
g++ -std=c++11 -o rest_server rest_server.cpp -lhttplib -lssl -lcrypto# 运行服务器
./rest_server
在 Windows 上

假设将代码保存为 rest_server.cpp,使用以下命令编译和运行(需要安装 MinGW 或 MSVC 编译器):

# 编译代码(MinGW)
g++ -std=c++11 -o rest_server rest_server.cpp -lhttplib -lssl -lcrypto# 运行服务器
./rest_server

六、测试 RESTful API

使用 curl 或 Postman 等工具来测试以下 API:

  • 获取所有用户GET http://localhost:8080/users
  • 获取特定用户GET http://localhost:8080/users/1
  • 创建用户POST http://localhost:8080/users
{"id": 1,"name": "John Doe"
}
  • 更新用户PUT http://localhost:8080/users/1
    { "name": "Jane Doe" }
  • 删除用户DELETE http://localhost:8080/users/1

七、总结

        本文详细介绍了 REST 和 RESTful API 的概念、原理及其与常用 HTTP 的区别。通过使用 cpp-httplib 库,我们在 C++ 中实现了一个简单的 RESTful API 服务器,提供了对用户资源的基本操作。通过这种方式,读者可以深入理解 RESTful API 的设计原则,并掌握其在 C++ 中的实现方法。

        RESTful API 提供了一种简洁、高效的方式来构建 Web 服务,随着现代 Web 应用的发展,它已成为主流的设计模式。通过本文的学习,相信读者能够在自己的项目中灵活应用 RESTful API,并进一步提高自身的开发技能。

 

这篇关于学懂C++(四十二):网络编程——RESTful API:概念、原理、核心点与 C++ 实现详解的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1097408

相关文章

Go语言开发实现查询IP信息的MCP服务器

《Go语言开发实现查询IP信息的MCP服务器》随着MCP的快速普及和广泛应用,MCP服务器也层出不穷,本文将详细介绍如何在Go语言中使用go-mcp库来开发一个查询IP信息的MCP... 目录前言mcp-ip-geo 服务器目录结构说明查询 IP 信息功能实现工具实现工具管理查询单个 IP 信息工具的实现服

SpringBoot基于配置实现短信服务策略的动态切换

《SpringBoot基于配置实现短信服务策略的动态切换》这篇文章主要为大家详细介绍了SpringBoot在接入多个短信服务商(如阿里云、腾讯云、华为云)后,如何根据配置或环境切换使用不同的服务商,需... 目录目标功能示例配置(application.yml)配置类绑定短信发送策略接口示例:阿里云 & 腾

Python ZIP文件操作技巧详解

《PythonZIP文件操作技巧详解》在数据处理和系统开发中,ZIP文件操作是开发者必须掌握的核心技能,Python标准库提供的zipfile模块以简洁的API和跨平台特性,成为处理ZIP文件的首选... 目录一、ZIP文件操作基础三板斧1.1 创建压缩包1.2 解压操作1.3 文件遍历与信息获取二、进阶技

一文详解Java异常处理你都了解哪些知识

《一文详解Java异常处理你都了解哪些知识》:本文主要介绍Java异常处理的相关资料,包括异常的分类、捕获和处理异常的语法、常见的异常类型以及自定义异常的实现,文中通过代码介绍的非常详细,需要的朋... 目录前言一、什么是异常二、异常的分类2.1 受检异常2.2 非受检异常三、异常处理的语法3.1 try-

Java中的@SneakyThrows注解用法详解

《Java中的@SneakyThrows注解用法详解》:本文主要介绍Java中的@SneakyThrows注解用法的相关资料,Lombok的@SneakyThrows注解简化了Java方法中的异常... 目录前言一、@SneakyThrows 简介1.1 什么是 Lombok?二、@SneakyThrows

Java中字符串转时间与时间转字符串的操作详解

《Java中字符串转时间与时间转字符串的操作详解》Java的java.time包提供了强大的日期和时间处理功能,通过DateTimeFormatter可以轻松地在日期时间对象和字符串之间进行转换,下面... 目录一、字符串转时间(一)使用预定义格式(二)自定义格式二、时间转字符串(一)使用预定义格式(二)自

Redis Pipeline(管道) 详解

《RedisPipeline(管道)详解》Pipeline管道是Redis提供的一种批量执行命令的机制,通过将多个命令一次性发送到服务器并统一接收响应,减少网络往返次数(RTT),显著提升执行效率... 目录Redis Pipeline 详解1. Pipeline 的核心概念2. 工作原理与性能提升3. 核

Python正则表达式语法及re模块中的常用函数详解

《Python正则表达式语法及re模块中的常用函数详解》这篇文章主要给大家介绍了关于Python正则表达式语法及re模块中常用函数的相关资料,正则表达式是一种强大的字符串处理工具,可以用于匹配、切分、... 目录概念、作用和步骤语法re模块中的常用函数总结 概念、作用和步骤概念: 本身也是一个字符串,其中

python实现svg图片转换为png和gif

《python实现svg图片转换为png和gif》这篇文章主要为大家详细介绍了python如何实现将svg图片格式转换为png和gif,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录python实现svg图片转换为png和gifpython实现图片格式之间的相互转换延展:基于Py

Python利用ElementTree实现快速解析XML文件

《Python利用ElementTree实现快速解析XML文件》ElementTree是Python标准库的一部分,而且是Python标准库中用于解析和操作XML数据的模块,下面小编就来和大家详细讲讲... 目录一、XML文件解析到底有多重要二、ElementTree快速入门1. 加载XML的两种方式2.