学懂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

相关文章

Java HashMap的底层实现原理深度解析

《JavaHashMap的底层实现原理深度解析》HashMap基于数组+链表+红黑树结构,通过哈希算法和扩容机制优化性能,负载因子与树化阈值平衡效率,是Java开发必备的高效数据结构,本文给大家介绍... 目录一、概述:HashMap的宏观结构二、核心数据结构解析1. 数组(桶数组)2. 链表节点(Node

Java AOP面向切面编程的概念和实现方式

《JavaAOP面向切面编程的概念和实现方式》AOP是面向切面编程,通过动态代理将横切关注点(如日志、事务)与核心业务逻辑分离,提升代码复用性和可维护性,本文给大家介绍JavaAOP面向切面编程的概... 目录一、AOP 是什么?二、AOP 的核心概念与实现方式核心概念实现方式三、Spring AOP 的关

详解SpringBoot+Ehcache使用示例

《详解SpringBoot+Ehcache使用示例》本文介绍了SpringBoot中配置Ehcache、自定义get/set方式,并实际使用缓存的过程,文中通过示例代码介绍的非常详细,对大家的学习或者... 目录摘要概念内存与磁盘持久化存储:配置灵活性:编码示例引入依赖:配置ehcache.XML文件:配置

从基础到高级详解Go语言中错误处理的实践指南

《从基础到高级详解Go语言中错误处理的实践指南》Go语言采用了一种独特而明确的错误处理哲学,与其他主流编程语言形成鲜明对比,本文将为大家详细介绍Go语言中错误处理详细方法,希望对大家有所帮助... 目录1 Go 错误处理哲学与核心机制1.1 错误接口设计1.2 错误与异常的区别2 错误创建与检查2.1 基础

k8s按需创建PV和使用PVC详解

《k8s按需创建PV和使用PVC详解》Kubernetes中,PV和PVC用于管理持久存储,StorageClass实现动态PV分配,PVC声明存储需求并绑定PV,通过kubectl验证状态,注意回收... 目录1.按需创建 PV(使用 StorageClass)创建 StorageClass2.创建 PV

Python版本信息获取方法详解与实战

《Python版本信息获取方法详解与实战》在Python开发中,获取Python版本号是调试、兼容性检查和版本控制的重要基础操作,本文详细介绍了如何使用sys和platform模块获取Python的主... 目录1. python版本号获取基础2. 使用sys模块获取版本信息2.1 sys模块概述2.1.1

一文详解Python如何开发游戏

《一文详解Python如何开发游戏》Python是一种非常流行的编程语言,也可以用来开发游戏模组,:本文主要介绍Python如何开发游戏的相关资料,文中通过代码介绍的非常详细,需要的朋友可以参考下... 目录一、python简介二、Python 开发 2D 游戏的优劣势优势缺点三、Python 开发 3D

Python实现字典转字符串的五种方法

《Python实现字典转字符串的五种方法》本文介绍了在Python中如何将字典数据结构转换为字符串格式的多种方法,首先可以通过内置的str()函数进行简单转换;其次利用ison.dumps()函数能够... 目录1、使用json模块的dumps方法:2、使用str方法:3、使用循环和字符串拼接:4、使用字符

Redis 基本数据类型和使用详解

《Redis基本数据类型和使用详解》String是Redis最基本的数据类型,一个键对应一个值,它的功能十分强大,可以存储字符串、整数、浮点数等多种数据格式,本文给大家介绍Redis基本数据类型和... 目录一、Redis 入门介绍二、Redis 的五大基本数据类型2.1 String 类型2.2 Hash

Java中的.close()举例详解

《Java中的.close()举例详解》.close()方法只适用于通过window.open()打开的弹出窗口,对于浏览器的主窗口,如果没有得到用户允许是不能关闭的,:本文主要介绍Java中的.... 目录当你遇到以下三种情况时,一定要记得使用 .close():用法作用举例如何判断代码中的 input