学懂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使用fastapi实现多语言国际化的操作指南

《python使用fastapi实现多语言国际化的操作指南》本文介绍了使用Python和FastAPI实现多语言国际化的操作指南,包括多语言架构技术栈、翻译管理、前端本地化、语言切换机制以及常见陷阱和... 目录多语言国际化实现指南项目多语言架构技术栈目录结构翻译工作流1. 翻译数据存储2. 翻译生成脚本

C++初始化数组的几种常见方法(简单易懂)

《C++初始化数组的几种常见方法(简单易懂)》本文介绍了C++中数组的初始化方法,包括一维数组和二维数组的初始化,以及用new动态初始化数组,在C++11及以上版本中,还提供了使用std::array... 目录1、初始化一维数组1.1、使用列表初始化(推荐方式)1.2、初始化部分列表1.3、使用std::

C++ Primer 多维数组的使用

《C++Primer多维数组的使用》本文主要介绍了多维数组在C++语言中的定义、初始化、下标引用以及使用范围for语句处理多维数组的方法,具有一定的参考价值,感兴趣的可以了解一下... 目录多维数组多维数组的初始化多维数组的下标引用使用范围for语句处理多维数组指针和多维数组多维数组严格来说,C++语言没

Spring Cloud LoadBalancer 负载均衡详解

《SpringCloudLoadBalancer负载均衡详解》本文介绍了如何在SpringCloud中使用SpringCloudLoadBalancer实现客户端负载均衡,并详细讲解了轮询策略和... 目录1. 在 idea 上运行多个服务2. 问题引入3. 负载均衡4. Spring Cloud Load

Springboot中分析SQL性能的两种方式详解

《Springboot中分析SQL性能的两种方式详解》文章介绍了SQL性能分析的两种方式:MyBatis-Plus性能分析插件和p6spy框架,MyBatis-Plus插件配置简单,适用于开发和测试环... 目录SQL性能分析的两种方式:功能介绍实现方式:实现步骤:SQL性能分析的两种方式:功能介绍记录

在 Spring Boot 中使用 @Autowired和 @Bean注解的示例详解

《在SpringBoot中使用@Autowired和@Bean注解的示例详解》本文通过一个示例演示了如何在SpringBoot中使用@Autowired和@Bean注解进行依赖注入和Bean... 目录在 Spring Boot 中使用 @Autowired 和 @Bean 注解示例背景1. 定义 Stud

如何通过Python实现一个消息队列

《如何通过Python实现一个消息队列》这篇文章主要为大家详细介绍了如何通过Python实现一个简单的消息队列,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录如何通过 python 实现消息队列如何把 http 请求放在队列中执行1. 使用 queue.Queue 和 reque

Python如何实现PDF隐私信息检测

《Python如何实现PDF隐私信息检测》随着越来越多的个人信息以电子形式存储和传输,确保这些信息的安全至关重要,本文将介绍如何使用Python检测PDF文件中的隐私信息,需要的可以参考下... 目录项目背景技术栈代码解析功能说明运行结php果在当今,数据隐私保护变得尤为重要。随着越来越多的个人信息以电子形

使用 sql-research-assistant进行 SQL 数据库研究的实战指南(代码实现演示)

《使用sql-research-assistant进行SQL数据库研究的实战指南(代码实现演示)》本文介绍了sql-research-assistant工具,该工具基于LangChain框架,集... 目录技术背景介绍核心原理解析代码实现演示安装和配置项目集成LangSmith 配置(可选)启动服务应用场景

使用Python快速实现链接转word文档

《使用Python快速实现链接转word文档》这篇文章主要为大家详细介绍了如何使用Python快速实现链接转word文档功能,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 演示代码展示from newspaper import Articlefrom docx import