现代C++在API世界中的实践:REST、GraphQL和gRPC

面向初学者的在线Python训练器

轻松学习Python,无需理论负担。在浏览器中直接解决带自动检查的实践任务,无需安装任何东西。

开始课程

C++ API开发:REST、GraphQL、gRPC



当谈到创建或使用API时,许多开发者习惯性地倾向于Python、Node.js或Go。但如果需要极致性能、底层内存控制,或者您工作在C++占据主导地位的遗留系统中,该怎么办?答案很简单:C++不仅在API世界中存活,而且蓬勃发展。让我们来剖析每位C++开发者都应掌握的三种关键方法:经典的REST、现代的GraphQL和高性能的gRPC。



本文不是枯燥的参考手册,而是一份实践指南,专为那些希望编写真实代码的开发者而写。我们将探讨这些技术如何在C++中应用,提供流行库的示例,并帮助您为任务选择合适的工具。



1. C++中的REST API:经典与现代实现



REST(表述性状态传递)仍然是最流行的API风格。它因简单、JSON可读性强和通用性而备受青睐。在C++中,我们有多种强大的工具可用于REST开发,其中最流行的是微软的cpprestsdk(也称为Casablanca)。



用C++编写REST客户端



假设我们需要从公共API获取天气数据。使用cpprestsdk的实现如下:



#include <cpprest/http_client.h>#include <cpprest/filestream.h>#include <iostream>

using namespace web;using namespace web::http;using namespace web::http::client;

int main() { // 创建HTTP客户端 http_client client(U("https://api.openweathermap.org/data/2.5"));

// 构建带参数的GET请求 uri_builder builder(U("/weather")); builder.append_query(U("q"), U("Moscow")); builder.append_query(U("appid"), U("YOUR_API_KEY")); builder.append_query(U("units"), U("metric"));

// 发送请求并获取响应 client.request(methods::GET, builder.to_string()) .then([](http_response response) { if (response.status_code() == status_codes::OK) { return response.extract_json(); } throw std::runtime_error("Failed to fetch data"); }) .then([](json::value jsonData) { std::cout << "Temperature: " << jsonData[U("main")][U("temp")].as_double() << "°C" << std::endl; }) .wait();

return 0;}


关键要点:

  • 异步性:cpprestsdk使用PPL(并行模式库)和futures,非常适合C++。
  • JSON处理:内置的json::value解析器可轻松操作数据。
  • 跨平台:该库支持Windows、Linux和macOS。


何时选择REST?

C++中的REST适用于:

  • 简单的CRUD操作
  • 与Web服务集成(社交网络、支付系统)
  • 原型开发和低负载微服务


2. GraphQL:C++中的灵活查询



GraphQL解决了REST的主要问题——过度获取(获取多余数据)和获取不足(需要多次请求才能获取完整信息)。在C++中,通常使用cppgraphql库或基于libcurl编写自定义客户端来处理GraphQL。



C++中的GraphQL查询示例



假设我们需要获取用户资料及其最新帖子——在REST中需要两次请求,而在GraphQL中只需一次:



#include <iostream>#include <curl/curl.h>#include <nlohmann/json.hpp>

using json = nlohmann::json;

static size_t WriteCallback(void *contents, size_t size, size_t nmemb, void *userp) { ((std::string*)userp)->a

博客

书籍推荐