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

相关文章

Spring Security基于数据库验证流程详解

Spring Security 校验流程图 相关解释说明(认真看哦) AbstractAuthenticationProcessingFilter 抽象类 /*** 调用 #requiresAuthentication(HttpServletRequest, HttpServletResponse) 决定是否需要进行验证操作。* 如果需要验证,则会调用 #attemptAuthentica

hdu1043(八数码问题,广搜 + hash(实现状态压缩) )

利用康拓展开将一个排列映射成一个自然数,然后就变成了普通的广搜题。 #include<iostream>#include<algorithm>#include<string>#include<stack>#include<queue>#include<map>#include<stdio.h>#include<stdlib.h>#include<ctype.h>#inclu

【C++ Primer Plus习题】13.4

大家好,这里是国中之林! ❥前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站。有兴趣的可以点点进去看看← 问题: 解答: main.cpp #include <iostream>#include "port.h"int main() {Port p1;Port p2("Abc", "Bcc", 30);std::cout <<

深入探索协同过滤:从原理到推荐模块案例

文章目录 前言一、协同过滤1. 基于用户的协同过滤(UserCF)2. 基于物品的协同过滤(ItemCF)3. 相似度计算方法 二、相似度计算方法1. 欧氏距离2. 皮尔逊相关系数3. 杰卡德相似系数4. 余弦相似度 三、推荐模块案例1.基于文章的协同过滤推荐功能2.基于用户的协同过滤推荐功能 前言     在信息过载的时代,推荐系统成为连接用户与内容的桥梁。本文聚焦于

C++包装器

包装器 在 C++ 中,“包装器”通常指的是一种设计模式或编程技巧,用于封装其他代码或对象,使其更易于使用、管理或扩展。包装器的概念在编程中非常普遍,可以用于函数、类、库等多个方面。下面是几个常见的 “包装器” 类型: 1. 函数包装器 函数包装器用于封装一个或多个函数,使其接口更统一或更便于调用。例如,std::function 是一个通用的函数包装器,它可以存储任意可调用对象(函数、函数

Andrej Karpathy最新采访:认知核心模型10亿参数就够了,AI会打破教育不公的僵局

夕小瑶科技说 原创  作者 | 海野 AI圈子的红人,AI大神Andrej Karpathy,曾是OpenAI联合创始人之一,特斯拉AI总监。上一次的动态是官宣创办一家名为 Eureka Labs 的人工智能+教育公司 ,宣布将长期致力于AI原生教育。 近日,Andrej Karpathy接受了No Priors(投资博客)的采访,与硅谷知名投资人 Sara Guo 和 Elad G

OpenHarmony鸿蒙开发( Beta5.0)无感配网详解

1、简介 无感配网是指在设备联网过程中无需输入热点相关账号信息,即可快速实现设备配网,是一种兼顾高效性、可靠性和安全性的配网方式。 2、配网原理 2.1 通信原理 手机和智能设备之间的信息传递,利用特有的NAN协议实现。利用手机和智能设备之间的WiFi 感知订阅、发布能力,实现了数字管家应用和设备之间的发现。在完成设备间的认证和响应后,即可发送相关配网数据。同时还支持与常规Sof

C++11第三弹:lambda表达式 | 新的类功能 | 模板的可变参数

🌈个人主页: 南桥几晴秋 🌈C++专栏: 南桥谈C++ 🌈C语言专栏: C语言学习系列 🌈Linux学习专栏: 南桥谈Linux 🌈数据结构学习专栏: 数据结构杂谈 🌈数据库学习专栏: 南桥谈MySQL 🌈Qt学习专栏: 南桥谈Qt 🌈菜鸡代码练习: 练习随想记录 🌈git学习: 南桥谈Git 🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈�

【C++】_list常用方法解析及模拟实现

相信自己的力量,只要对自己始终保持信心,尽自己最大努力去完成任何事,就算事情最终结果是失败了,努力了也不留遗憾。💓💓💓 目录   ✨说在前面 🍋知识点一:什么是list? •🌰1.list的定义 •🌰2.list的基本特性 •🌰3.常用接口介绍 🍋知识点二:list常用接口 •🌰1.默认成员函数 🔥构造函数(⭐) 🔥析构函数 •🌰2.list对象

【Prometheus】PromQL向量匹配实现不同标签的向量数据进行运算

✨✨ 欢迎大家来到景天科技苑✨✨ 🎈🎈 养成好习惯,先赞后看哦~🎈🎈 🏆 作者简介:景天科技苑 🏆《头衔》:大厂架构师,华为云开发者社区专家博主,阿里云开发者社区专家博主,CSDN全栈领域优质创作者,掘金优秀博主,51CTO博客专家等。 🏆《博客》:Python全栈,前后端开发,小程序开发,人工智能,js逆向,App逆向,网络系统安全,数据分析,Django,fastapi