尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
Qt POST JSON 全攻略:QNetworkAccessManager 原理、同步异步写法与避坑
简介这是一份面向Qt初学者的HTTP POST请求示例工程演示如何借助QNetworkAccessManager向服务器提交JSON格式数据。项目包含完整可运行的Qt工程文件涉及QJsonDocument/QJsonObject构造JSON、QString::toUtf8()编码、设置application/json请求头以及信号槽处理响应等关键知识点适合正在学习Qt网络编程或需要快速集成JSON接口的C开发者参考。压缩包共5个文件其中main.cpp与mainwindow.cpp承担程序入口和请求逻辑mainwindow.h声明界面类与槽函数mainwindow.ui提供简单交互界面QtHttp.pro则配置了network、widgets等必要模块依赖整体仅3KB结构精简便于直接打开对比学习。该资源上线以来已有5380人学习下载示例代码虽小却完整覆盖了从构造请求到异步响应的典型流程对理解Qt网络模块与JSON数据处理之间的配合很有帮助也可作为桌面应用对接HTTP接口的起步模板。1. Qt 里发 POST JSON为什么这件事没有想象中省事在某个内部管理系统里我需要用 Qt 写一个数据上报模块把 JSON 格式的业务数据 POST 到服务端。第一反应很简单有 QNetworkAccessManager、QNetworkRequest 和 post()照着文档半小时就能跑通。实际花了大半天服务端一直回 400回头检查才发现 Content-Type 没设置、请求体里混了 QString 到 QByteArray 的错误转换、还踩了响应后忘记释放 reply 的坑。每个问题单独看都是小问题叠在一起足以让人怀疑人生。这篇文章想把「Qt 用 POST 发 JSON」这件事讲清楚。我会从三个核心类的分工说起给出同步和异步两套可以直接抄的代码再列出实战中踩过的翻车现场和排查手段最后聊一个把 HTTP 请求封装成可复用模块的习惯。如果你刚开始接触 Qt 网络模块按步骤走可以少走弯路如果你已经写过这类请求直接跳到避坑章节可能更有收获。内容以 Qt 5.15 及以上版本为主Qt 6 的思路完全一致。2. 选型和原理POST JSON 背后是哪几个类在帮你干活先别急着写代码。在 Qt 里发 HTTP POST 请求哪怕只是发一个简单的 JSON背后涉及的类也比你想象的多。我见过有人直接拿 QNetworkAccessManager 调 post()传一个 QByteArray 进去以为完事了却不知道服务端需要特定的 Content-Type结果接口返回 415。这一章先把参与协作的几个类讲清楚再讨论同步和异步两种等待响应方式怎么选。2.1 三个核心类的分工QNetworkAccessManager、QNetworkRequest、QNetworkReplyQNetworkAccessManager 负责发起请求这个动作。API 设计上是纯异步的调用 post() 后它立刻返回真正的网络 I/O 在底层线程池里执行完成后再通过 finished 信号通知你。一个容易被忽略的特性是同一个 manager 实例可以同时发起多个请求每个请求返回独立的 QNetworkReply 指针你需要在槽函数或 lambda 里判断是哪个 reply 发出的事件。QNetworkRequest 负责描述这次请求长什么样。URL、请求头、超时、缓存策略都挂在它身上。POST JSON 的关键在于Content-Type 必须显式设置为 application/json并且要在调用 post() 之前完成。有人用默认的 text/plain 去请求 JSON 接口服务端要么直接拒绝要么按表单解析导致字段丢失。我也见过有人用了application/json;charsetUTF-8去请求某些老框架写的接口对方只认纯application/json怎么调都 415。QNetworkReply 是响应对象既是响应内容的容器也是请求状态的报告者。可以用 readAll() 读取响应体用 attribute() 获取状态码用 error() 判断是否有传输层错误。注意 QNetworkReply 是 QObject 子类用完必须 deleteLater() 释放。在高频请求的模块里漏掉释放会导致内存只增不减时间久了会出现诡异的资源耗尽。除了这三个类还有两个容易忽略的属性。QNetworkRequest 的 FollowRedirectsAttribute 默认是 false如果接口返回 302 跳转Qt 不会自动跟随新地址请求会以 302 状态码返回而非最终内容。做登录跳转或者老服务迁移时特别容易踩到。另一个是代理企业内网环境经常要挂代理才能访问外网QNetworkProxyFactory::setUseSystemConfiguration(true) 可以让 Qt 读取系统代理配置否则你在家能跑通到公司突然就不行了。我的选型体会是这三个类没有替代品做 HTTP 就是这套组合但你要对每个类的边界心里有数。manager 负责生命周期和连接复用request 是配置中心reply 是你跟服务端对话的收据。2.2 同步 vs 异步两种等响应的方式到底怎么选如果你的程序是命令行工具、单元测试或者某种顺序执行的状态机同步写法更顺手。常见做法是借助 QEventLoop 把异步信号转成阻塞等待post() 发出请求后连接 reply 的 finished 信号到 loop.quit()再 loop.exec() 卡住流程直到请求结束最后从 reply 里取数据。好处是代码自上而下读起来和普通函数没有区别坏处是 QEventLoop 会开启一个本地事件循环如果你的程序本来就在另一个事件循环里调用它嵌套循环处理网络事件和定时器时可能出现重入问题。GUI 程序我更倾向于用异步回调。点击按钮发请求界面不卡数据到了再更新 UI。这里有一个线程安全的隐情QNetworkReply 的 finished 信号默认在创建 reply 的那个线程里派发如果你在 main thread 创建的 manager回调也大概率在 main thread直接操作 UI 是安全的。如果你把网络请求丢到工作线程就要注意 QNetworkAccessManager 是一个有线程亲和性的对象跨线程调用 post() 得格外小心常见的做法是每个工作线程创建独立的 manager。还有一个和性能有关的点同一个 QNetworkAccessManager 实例对同一个 host:port 会复用底层 TCP 连接连接池效果更好。如果你每次请求都 new 一个 manager连接池就形同虚设。我习惯让每个模块持有自己的 manager 成员和模块生命周期一致。并发方面manager 本身没有并发上限但大量请求同时发出会占用系统 fd 和 socket 缓冲区业务层自己要做合理限流。3. 用 Qt 发送 POST JSON从最小代码到参数说明这一章目标明确给出能跑通的 Qt 代码POST 一个 JSON 到指定接口并拿到响应。同步写法先给因为逻辑直观异步写法再给因为界面程序更常用。两种写法的代码都完整贴出后面说明每个参数为什么这样设。3.1 同步写法用 QEventLoop 阻塞等待响应适合脚本和工具#include QCoreApplication #include QNetworkAccessManager #include QNetworkRequest #include QNetworkReply #include QJsonDocument #include QJsonObject #include QEventLoop #include QDebug void postJsonSync(const QString url, const QJsonObject payload) { QNetworkAccessManager manager; // 构造请求URL 和请求头都挂在 QNetworkRequest 上 QNetworkRequest request(QUrl(url)); request.setHeader(QNetworkRequest::ContentTypeHeader, application/json); request.setHeader(QNetworkRequest::UserAgentHeader, MyQtApp/1.0); request.setTransferTimeout(30000); // 30 秒无传输则超时 // 把 QJsonObject 转成 QByteArray这一步生成请求体 QByteArray requestBody QJsonDocument(payload).toJson(QJsonDocument::Compact); // 发出 POST 请求manager 会立即返回并开始后台 I/O QNetworkReply *reply manager.post(request, requestBody); // 借助 QEventLoop 把异步信号转为阻塞等待 QEventLoop loop; QObject::connect(reply, QNetworkReply::finished, loop, QEventLoop::quit); loop.exec(); // 请求结束检查错误和状态码 if (reply-error() QNetworkReply::NoError) { QByteArray responseData reply-readAll(); QJsonDocument doc QJsonDocument::fromJson(responseData); qDebug() Response: doc.toJson(QJsonDocument::Indented); } else { qDebug() Error: reply-errorString(); } reply-deleteLater(); }这段代码的核心有三个地方。第一ContentTypeHeader 必须显式设置为 application/json这是服务端能否正确解析请求体的前提。第二QJsonDocument::toJson(QJsonDocument::Compact) 生成紧凑 JSON不含多余空白如果你在调试阶段想看完整结构可以改用 Indented但两者对服务端没有区别。第三setTransferTimeout 是 Qt 5.15 之后新增的接口底层实现是总传输时间限制比单纯用 QTimer 判断更可靠。关于超时参数我的习惯是按照接口的预期响应时间来定。普通业务接口给 10 到 30 秒文件上传接口放宽到 60 秒以上。如果服务端长时间无响应setTransferTimeout 会触发超时错误reply 的 error() 返回 OperationCanceledError你可以据此提示用户重试而不是让程序挂死。QEventLoop 这种同步写法的局限在于嵌套。如果你的业务逻辑本身跑在一个按钮点击槽函数里而槽函数所在窗口又维护了其他定时器loop.exec() 开启的本地循环会递归派发事件有可能导致定时器回调提前执行。所以这个写法我只推荐用于命令行工具、自动化测试和启动阶段的一次性请求不推荐在 GUI 主流程里用。3.2 异步写法信号槽回调适合 GUI 程序不卡界面#include QNetworkAccessManager #include QNetworkRequest #include QNetworkReply #include QJsonDocument #include QJsonObject #include QPointer void postJsonAsync(QNetworkAccessManager *manager, const QString url, const QJsonObject payload, std::functionvoid(bool, const QJsonObject , const QString ) callback) { QNetworkRequest request(QUrl(url)); request.setHeader(QNetworkRequest::ContentTypeHeader, application/json); request.setTransferTimeout(30000); QByteArray requestBody QJsonDocument(payload).toJson(QJsonDocument::Compact); QNetworkReply *reply manager-post(request, requestBody); // 用 QPointer 持有 reply防止对象析构后指针悬垂 QPointerQNetworkReply replyGuard(reply); QObject::connect(reply, QNetworkReply::finished, manager, [replyGuard, callback]() { if (replyGuard.isNull()) { callback(false, QJsonObject(), reply is destroyed); return; } QNetworkReply *r replyGuard.data(); // 同时检查网络错误和 HTTP 状态码 int statusCode r-attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt(); if (r-error() QNetworkReply::NoError statusCode 200 statusCode 300) { QJsonDocument doc QJsonDocument::fromJson(r-readAll()); callback(true, doc.object(), QString()); } else { callback(false, QJsonObject(), r-errorString()); } r-deleteLater(); }); }异步写法里我把回调以 std::function 形式传入这样同一个函数既能被按钮点击调用也能被业务状态机调用回调里再去做界面更新或状态流转。在 connect 时context 对象传了 manager而不是传 this 或 nullptr这样当 manager 被销毁时连接自动断开避免回调变成悬垂调用。一个实战中容易翻车的点是finished 信号触发时reply 可能已经被外部取消并调用了 deleteLater()。lambda 如果直接捕获裸指针访问时可能崩溃。我用 QPointer 保存 reply每次访问前判断 isNull()这是一个低成本的保险。回调参数我固定为三个成功标志、JSON 数据、错误字符串。三个参数比只传一个 QJsonObject 更实用因为调用方经常需要区分请求失败和请求成功但业务返回错误码两种情况。如果你有统一的错误码约定可以把业务状态码也塞进参数里看项目需要。4. POST JSON 之外multipart 上传与 PUT/PATCH 的写法标题虽然只写了 POST JSON但实际工作中你会发现POST 这个动词背后的请求体格式远不止一种。比如上传图片接口要求 multipart/form-data更新资源接口要求 PUT 或 PATCH。这些场景紧挨着 POST JSON 的写法我放在这一章一并讲掉。4.1 用 QHttpMultiPart 构造 multipart 请求文件上传场景如果服务端接收的是表单格式数据特别是文件上传接口QHttpMultiPart 就派上用场了。思路是先构造一个 QHttpMultiPart 对象再往里添加 QHttpPart每个 QHttpPart 可以设置自身的内容描述头最后把 QHttpMultiPart 作为 post() 的第二个参数传入。#include QHttpMultiPart #include QHttpPart #include QFile #include QNetworkAccessManager void uploadFileWithJson(QNetworkAccessManager *manager, const QString url, const QString filePath, const QJsonObject meta) { QNetworkRequest request(QUrl(url)); // multipart 请求的 Content-Type 由 Qt 自动生成 // 包括 multipart/form-data 和 boundary 随机串 QHttpMultiPart *multiPart new QHttpMultiPart(QHttpMultiPart::FormDataType); // 先加一个 JSON 文本字段 QHttpPart jsonPart; jsonPart.setHeader(QNetworkRequest::ContentDispositionHeader, form-data; name\meta\); jsonPart.setBody(QJsonDocument(meta).toJson(QJsonDocument::Compact)); multiPart-append(jsonPart); // 再加文件字段 QHttpPart filePart; filePart.setHeader(QNetworkRequest::ContentDispositionHeader, form-data; name\file\; filename\test.png\); filePart.setHeader(QNetworkRequest::ContentTypeHeader, image/png); QFile *file new QFile(filePath); if (!file-open(QIODevice::ReadOnly)) { qWarning() file open failed: file-errorString(); delete file; return; } filePart.setBodyDevice(file); file-setParent(multiPart); // multiPart 接管 file 生命周期 multiPart-append(filePart); // 发送完成后multiPart 的生命周期由 reply 接管 QNetworkReply *reply manager-post(request, multiPart); multiPart-setParent(reply); QObject::connect(reply, QNetworkReply::finished, manager, [reply]() { if (reply-error() QNetworkReply::NoError) { qDebug() upload finished: reply-readAll(); } else { qWarning() upload error: reply-errorString(); } reply-deleteLater(); }); }这段代码里有两个关键细节。第一file-setParent(multiPart) 把文件对象挂在 multiPart 下multiPart-setParent(reply) 又把整个 multiPart 挂在 reply 下三者形成一个对象树。当请求结束、reply 被 deleteLater() 释放时整条链的对象都被清理不会出现文件指针悬垂或者内存泄漏。第二multipart 请求的 Content-Type 千万不要手动设置成 application/json那会破坏 boundary 结构服务端解析不出来。这里必须提醒一句multipart 请求会把整个 body 先构建在内存里包括文件内容。QHttpMultiPart 底层用 QByteArray 保存每个 part 数据上传一个几百 MB 的大文件时内存会同步飙升。真正的流式上传需要配合自定义 QIODevice 做分段读取复杂度完全不同。所以文件超过几十 MB 时先看服务端有没有分片上传接口别把 multipart 当成万能解药。4.2 PUT/PATCH 和 POST 的差别换一个方法名多一个 setRawHeaderRESTful 接口里更新资源可能要求用 PUT 或 PATCH而不是 POST。Qt 里这个差别小得容易让人错过只需要换一个方法名请求体的构造方式完全一样。void putJson(QNetworkAccessManager *manager, const QString url, const QJsonObject payload) { QNetworkRequest request(QUrl(url)); request.setHeader(QNetworkRequest::ContentTypeHeader, application/json); request.setTransferTimeout(30000); QByteArray body QJsonDocument(payload).toJson(QJsonDocument::Compact); // PUT 请求和 POST 的差别仅在方法名 QNetworkReply *reply manager-put(request, body); // 如果是 PATCHQt 没有封装用 sendCustomRequest 发送 // QNetworkReply *reply manager-sendCustomRequest(request, PATCH, body); QObject::connect(reply, QNetworkReply::finished, manager, [reply]() { if (reply-error() QNetworkReply::NoError) { qDebug() reply-readAll(); } reply-deleteLater(); }); }PATCH 在 Qt 里没有专门封装需要走 sendCustomRequest。这个函数接受一个 QByteArray 表示 HTTP 方法名第三个参数传请求体。用的时候注意方法名大小写敏感PATCH 不能写成 patch否则一些服务端框架会当作非法方法直接拒绝。另外sendCustomRequest 也允许你传 PUT、DELETE 等任何方法所以它是处理非标准方法时的兜底工具。处理响应时有一个常见误区只判断 reply-error()不看 HTTP 状态码。实际情况是 404、500 这些错误未必会触发 QNetworkReply::error()尤其当服务端返回了合法的 HTTP 响应体但语义是错误时error() 可能保持 NoError。稳妥做法是同时读取 HttpStatusCodeAttribute并且把状态码在 200-299 之间才算成功。我在项目里写过一个辅助函数专门做这个判断避免把错误页当正常数据解析。5. 避坑与排查POST JSON 常见的 5 个翻车现场这一章记录我实际踩过的坑按「现象 → 原因 → 解决」的结构写。有些坑看起来基础但真到排查环节方向不对能折腾一整天。5.1 现象服务端收到空字段或者中文乱码现象是 POST 出去的 JSON 在服务端日志里字段缺失中文内容变成问号或乱码。第一次遇到时我以为是网络传输丢了数据后来才发现是本地代码的问题。原因是 QString 到 QByteArray 的转换出了岔子。有人图省事先把 QJsonDocument 转成 QString再用 qPrintable() 或 toLocal8Bit() 转回 QByteArray遇到中文就直接被当前系统编码污染。Qt 5 里 QString::toUtf8() 没问题但项目里如果有人改了默认编码或者在 Windows 上用了 GBK 本地编码字符串就在不知不觉中变了味道。解决的思路是全程使用 QByteArray不让 QString 在其中中转。QJsonDocument::toJson() 返回的是 UTF-8 编码的 QByteArray直接把它传给 manager.post() 即可。如果调试时确实需要把响应体打出来看再用 QString::fromUtf8() 显式转换。5.2 现象QNetworkReply 报 ProtocolInvalidOperation 错误现象是调用 post() 后reply 的 error() 返回 ProtocolInvalidOperation错误信息类似 Operation cannot be performed on a QNetworkReply that was created for GET。原因大多数是代码没有走 manager.post()而是走了 manager.get() 或默认构造的 QNetworkRequest 加 sendCustomRequest 时方法名写错。还有一种是你在 finished 信号触发后又对同一个 reply 执行了非读取类的新操作比如 attempt 去写入数据接口本身不支持这种用法。解决方法是先检查请求方法确实由 post() 发出然后确认回调里只读取不写回。如果需要在同一个 reply 上多次读取内容先把 readAll() 结果存到 QByteArray 变量里不要反复调用 reply 的接口。5.3 现象HTTPS 接口报 SSL 握手失败现象是请求发送到 https 接口时服务端日志看到 TLS 握手失败Qt 端返回 SSL 相关错误比如 SSL handshake failed 或 unable to get local issuer certificate。原因有两个常见方向。第一运行环境缺少对应平台的 SSL 库。Windows 上 Qt 5 依赖 OpenSSL 动态库很多人没把 libcrypto 和 libssl 的 DLL 部署到 exe 同目录Linux 上则可能缺少对应版本的 libssl。第二服务端使用自签名证书或私有 CA 签发的证书Qt 默认不信任。解决方法分两步。先调用 QSslSocket::supportsSsl() 确认 SSL 库是否可用如果不可用补齐运行库如果是证书信任问题可以给 request 配置自定义 CA#include QSslSocket #include QSslConfiguration #include QSslCertificate if (!QSslSocket::supportsSsl()) { qWarning() SSL library is not available; return; } QSslConfiguration sslConfig QSslConfiguration::defaultConfiguration(); sslConfig.setCaCertificates(QSslCertificate::fromPath(ca.pem)); request.setSslConfiguration(sslConfig);这段代码加载了一个自定义的 CA 证书文件。注意生产环境不要关闭证书校验这是安全底线自签证书只适合开发和测试环境。5.4 现象请求发出后没有响应界面卡死现象是点击按钮后界面无响应程序看起来像死锁CPU 可能居高也可能为 0。原因是同步写法的 QEventLoop 跑在了 GUI 线程内而按钮槽函数本身已经在主事件循环里执行。loop.exec() 开启新的本地循环时如果 finished 信号依赖的事件分发被某些模态操作阻塞就会形成等待链条。常见于嵌套模态对话框、跨线程信号槽连接使用了 Qt::BlockingQueuedConnection、或者某些全局定时器在阻塞操作中反复触发。解决方法是 GUI 界面统一用异步写法把 QEventLoop 留给命令行工具。如果业务逻辑必须顺序执行可以把整段网络请求丢到 QtConcurrent::run 里再通过信号把结果传回界面线程。这样既保持了顺序逻辑又不会卡住 UI。5.5 现象服务端返回 400 或 415接口文档没问题现象是代码照着文档写格式和字段都对服务端仍然返回 400 Bad Request 或 415 Unsupported Media Type。原因是 Content-Type 写法差异。有人设置了 application/json; charsetutf-8某些老框架不认带 charset 的写法只认纯的 application/json反之某些新框架严格要求必须带 charset。两种服务端我都遇到过同一家公司不同微服务之间的行为都不一致。解决方法是先试纯 application/json如果接口文档明确要求 charset 再改。排查这类问题最快的路径是抓包或者看服务端日志确认它收到的 Content-Type 和 body 到底是什么。别凭猜数据是唯一的真相。6. 进阶把 POST JSON 封装成可复用模块的一个习惯当项目里多个界面都要发 POST JSON 请求时就该做统一封装了。不是搭一个大型网络框架而是做一件小事把「构造请求头、序列化 JSON、发起请求、处理超时、统一回调错误」抽到一个公共入口让各业务模块只关心数据不关心网络细节。class HttpJsonClient : public QObject { Q_OBJECT public: using ResponseCallback std::functionvoid(bool ok, const QJsonObject data, const QString error); static HttpJsonClient *instance(); void postJson(const QString url, const QJsonObject payload, ResponseCallback cb, int timeoutMs 30000); private: QNetworkAccessManager *m_manager nullptr; };实现内部的核心逻辑是QNetworkAccessManager 作为常驻成员变量每个 postJson 调用都新建 QNetworkRequest统一设置 Content-Type 和超时然后用 QPointer 保护 reply回调里统一校验状态码和网络错误最后把 JSON 解析结果抛给上层。这样的封装带来一个实际收益当接口从 HTTP 切到 HTTPS或者域名整体迁移时只改封装内部业务模块完全不用动。有人担心多个并发请求会把回调搞混其实不会。每个请求对应独立的 reply业务回调通过捕获自己的上下文变量来区分比如在函数参数里带一个 requestId。我在封装里总是加一个请求 ID 字段日志里能看到每次请求的耗时、URL 和返回码排查线上问题的时候帮助很大。另外两个习惯我坚持了很久。第一所有 HTTP 请求的请求体在发出之前先打日志确认 QJsonDocument 转出的 QByteArray 是预期的 UTF-8 JSON 文本而不是被本地编码污染过的数据。第二对 HTTP 状态码做完整的 2xx 判断而不是只依赖 reply-error()因为服务端返回 500 时 error() 不见得会报错。这两条防止了我在项目里遇到的大部分“看起来没毛病但就是不通”的诡异问题。希望帮到你。本文还有配套的精品资源点击获取
RELATED

相关推荐

程序员英语词汇精讲:comma(逗号)——符号类技术词汇的发音、语义与编程应用

程序员英语词汇精讲:comma(逗号)——符号类技术词汇的发音、语义与编程应用

教程 【免费下载链接】most-frequent-technology-english-words 程序员工作中常见的英语词汇 项目地址: https://gitcode.com/gh_mirrors/mo/most-frequent-technology-english-words 点击查看 免费下载 本文以开源仓库 most-frequent-technology-english-words&am…

📅 2026/10/15 2:52:47
Qt自适应控件:基于BDU的跨DPI/缩放响应式UI方案

Qt自适应控件:基于BDU的跨DPI/缩放响应式UI方案

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

📅 2026/10/15 2:47:47
2026论文爆款降AIGC平台大曝光:一键改写直达人工原创!

2026论文爆款降AIGC平台大曝光:一键改写直达人工原创!

降AI率的核心技术也在这场博弈中完成了进化。到了2026年,那些只会机械替换同义词的劣质软件早就被淘汰,顶级的降AIGC大模型已经迈入了深度语义重构的新纪元。真正硬核的降AI平台,不仅能顺手把重复率降下来,更牛的是它们能像X光一样…

📅 2026/10/15 2:47:47
MORE NEWS

更多资讯

📰

Raft算法实战指南:从原理到生产落地的分布式一致性详解

1. 这不是教科书里的“分布式”,而是我踩过坑后才敢写的实战笔记“分布式理论与分布式一致性算法详解”——看到这个标题,你脑子里是不是立刻浮现出一堆抽象符号、希腊字母和论文截图?别急,先放下那些让你头皮发紧的Paxos推导图。…

📰

PAT甲级1104:连续子段求和的贡献法推导与long double精度坑

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

📰

OpenAI SDK平滑迁移,如何零代码重构接入新API?

一、 为什么迁移成本是选型关键? 在 AI 应用开发中,无论是聊天助手、知识库问答还是内容生成工具,常见架构都是在业务层外面包一层模型调用服务。当业务发展到一定阶段,企业往往需要更换或增加 API 供应商。此时,如果新…

📰

程序员英语词汇宝典精讲:consumption(消耗)——资源监控、消息消费与性能分析中的高频技术词汇

教程 【免费下载链接】most-frequent-technology-english-words 程序员工作中常见的英语词汇 项目地址: https://gitcode.com/gh_mirrors/mo/most-frequent-technology-english-words 点击查看 免费下载 本指南以 consumption 词条 为切入点,结合「程序…

📰

车辆动力学标定实战:从参数辨识到模型验证的完整流程

1. 课程定位与核心问题拆解1.1 这门课到底在解决什么问题车辆动力学标定,说白了就是让仿真模型和真实车辆“对上号”。很多同学在做车辆控制、自动驾驶算法验证或者底盘调校的时候,都会遇到一个尴尬的局面:仿真里跑得漂漂亮亮,一上…

📰

Apereo CAS 指标导出 Datadog 实战:Micrometer Registry 配置与运维指南

后端认证鉴权单点登录 【免费下载链接】cas Apereo CAS - Identity & Single Sign On for all earthlings and beyond. 项目地址: https://gitcode.com/gh_mirrors/ca/cas 点击查看 免费下载 本指南聚焦于 Apereo CAS 将运行时指标周期性地导出到 Datadog 的完…

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

读完文章,想聊聊您的网站?

告诉我们您的行业与需求,资深顾问一对一梳理方案与报价,全程免费。

📞 💬