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

相关文章

基于Python Playwright进行前端性能测试的脚本实现

《基于PythonPlaywright进行前端性能测试的脚本实现》在当今Web应用开发中,性能优化是提升用户体验的关键因素之一,本文将介绍如何使用Playwright构建一个自动化性能测试工具,希望... 目录引言工具概述整体架构核心实现解析1. 浏览器初始化2. 性能数据收集3. 资源分析4. 关键性能指

使用Redis快速实现共享Session登录的详细步骤

《使用Redis快速实现共享Session登录的详细步骤》在Web开发中,Session通常用于存储用户的会话信息,允许用户在多个页面之间保持登录状态,Redis是一个开源的高性能键值数据库,广泛用于... 目录前言实现原理:步骤:使用Redis实现共享Session登录1. 引入Redis依赖2. 配置R

SpringBoot实现RSA+AES自动接口解密的实战指南

《SpringBoot实现RSA+AES自动接口解密的实战指南》在当今数据泄露频发的网络环境中,接口安全已成为开发者不可忽视的核心议题,RSA+AES混合加密方案因其安全性高、性能优越而被广泛采用,本... 目录一、项目依赖与环境准备1.1 Maven依赖配置1.2 密钥生成与配置二、加密工具类实现2.1

使用Python的requests库调用API接口的详细步骤

《使用Python的requests库调用API接口的详细步骤》使用Python的requests库调用API接口是开发中最常用的方式之一,它简化了HTTP请求的处理流程,以下是详细步骤和实战示例,涵... 目录一、准备工作:安装 requests 库二、基本调用流程(以 RESTful API 为例)1.

在Java中实现线程之间的数据共享的几种方式总结

《在Java中实现线程之间的数据共享的几种方式总结》在Java中实现线程间数据共享是并发编程的核心需求,但需要谨慎处理同步问题以避免竞态条件,本文通过代码示例给大家介绍了几种主要实现方式及其最佳实践,... 目录1. 共享变量与同步机制2. 轻量级通信机制3. 线程安全容器4. 线程局部变量(ThreadL

Go语言使用select监听多个channel的示例详解

《Go语言使用select监听多个channel的示例详解》本文将聚焦Go并发中的一个强力工具,select,这篇文章将通过实际案例学习如何优雅地监听多个Channel,实现多任务处理、超时控制和非阻... 目录一、前言:为什么要使用select二、实战目标三、案例代码:监听两个任务结果和超时四、运行示例五

python使用Akshare与Streamlit实现股票估值分析教程(图文代码)

《python使用Akshare与Streamlit实现股票估值分析教程(图文代码)》入职测试中的一道题,要求:从Akshare下载某一个股票近十年的财务报表包括,资产负债表,利润表,现金流量表,保存... 目录一、前言二、核心知识点梳理1、Akshare数据获取2、Pandas数据处理3、Matplotl

Linux线程同步/互斥过程详解

《Linux线程同步/互斥过程详解》文章讲解多线程并发访问导致竞态条件,需通过互斥锁、原子操作和条件变量实现线程安全与同步,分析死锁条件及避免方法,并介绍RAII封装技术提升资源管理效率... 目录01. 资源共享问题1.1 多线程并发访问1.2 临界区与临界资源1.3 锁的引入02. 多线程案例2.1 为

分布式锁在Spring Boot应用中的实现过程

《分布式锁在SpringBoot应用中的实现过程》文章介绍在SpringBoot中通过自定义Lock注解、LockAspect切面和RedisLockUtils工具类实现分布式锁,确保多实例并发操作... 目录Lock注解LockASPect切面RedisLockUtils工具类总结在现代微服务架构中,分布

Java使用Thumbnailator库实现图片处理与压缩功能

《Java使用Thumbnailator库实现图片处理与压缩功能》Thumbnailator是高性能Java图像处理库,支持缩放、旋转、水印添加、裁剪及格式转换,提供易用API和性能优化,适合Web应... 目录1. 图片处理库Thumbnailator介绍2. 基本和指定大小图片缩放功能2.1 图片缩放的