当前位置: 首页 > news >正文

C++ Poco服务端框架中JSON的使用

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

文章目录

  • 前言
  • 一、JSON是什么?
  • 二、使用步骤
  • 总结


前言

上面一篇文章教你学会了Poco开发服务端应用,这个教程教会你使用JSON。一般传JSON的时候都是POST请求,很少有人把JSON序列化放在GET请求里,不安全。

如果你不会开发服务端就先看下下面的文章,通俗易懂。我直接开门见山了,默认环境已经有了。

手把手教你使用Poco框架开发服务器应用


一、JSON是什么?

JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,设计上易于人类阅读和编写,同时也便于机器解析和生成。它源自 JavaScript 编程语言,但现在被广泛用于不同的编程环境中。

JSON 的特点
文本格式:JSON 是一种纯文本格式,由键值对和数组组成。
语言无关:虽然最初基于 JavaScript,但现在几乎所有编程语言都支持 JSON。
轻量级:结构简单,适用于数据交换,尤其是在 Web 应用程序中。

二、使用步骤

基于上面的代码在RequestHander里面先解析JSON,再写回JSON。

UpdateRequestHanler.cpp

//
// Created by anold on 2024-08-06.
//#ifndef POCO_HTTP_SERVER_UPDATEREQUESTHANDLER_H
#define POCO_HTTP_SERVER_UPDATEREQUESTHANDLER_H#include <iostream>
#include <Poco/Net/HTTPRequestHandler.h>
#include <Poco/Net/HTTPServerRequest.h>
#include <Poco/Net/HTTPServerResponse.h>
#include <Poco/JSON/Parser.h>
#include <Poco/JSON/Stringifier.h>
#include <Poco/Dynamic/Var.h>
#include <Poco/Data/RecordSet.h>
#include <Poco/Data/DataException.h>
#include <Poco/Data/MySQL/MySQLException.h>using namespace Poco::Net;class UpdateRequestHandler : public Poco::Net::HTTPRequestHandler {
public:void handleRequest(HTTPServerRequest &request, HTTPServerResponse &response) override {response.setStatus(Poco::Net::HTTPResponse::HTTP_OK);response.setContentType("application/json");auto &os = response.send();//root就是一会要response的JSON结构,因为就算出错了也要告诉请求人结果Poco::JSON::Object root;//JSON对象转换成字符串流std::stringstream ss;try {//JSON解析代码,可以直接把request.stream()传进去一次性解析出来Poco::JSON::Parser parser;Poco::Dynamic::Var result = parser.parse(request.stream());//object 就是最终解析的JSON对象,是个智能指针不需要手动回收内存,如果解析失败会触发异常Poco::JSON::Object::Ptr object = result.extract<Poco::JSON::Object::Ptr>();//JSON取值代码,这里没有对key是否存在和类型进行判断,二十借助了异常简化了代码实现//比如需要int类型,哪怕传个数字字符串也可以正常解析,会自动转换,如果是字母就抛异常auto id = object->getValue<int>("id");auto class_id = object->getValue<int>("class_id");//数据库会话池Session session(MySQLSessionPool::pool->get());if (!session.isGood()) {root.set("status", -400);root.set("message", "Error Connect To MySQL");//JSON对象写入字符串流然后序列化成字符串responsePoco::JSON::Stringifier::stringify(root, ss);os << ss.str();return;}//语句执行Statement statement(session);statement << "UPDATE student SET class_id=? WHERE id=?", use(class_id), use(id);auto rows = statement.execute();std::cout << "Effect Rows: " << rows << std::endl;if (statement.done() && rows == 1) {root.set("status", 200);root.set("message", "Success");Poco::JSON::Stringifier::stringify(root, ss);os << ss.str();} else {root.set("status", -500);root.set("message", "Error Execute Statement");Poco::JSON::Stringifier::stringify(root, ss);os << ss.str();return;}} catch (const Poco::Data::MySQL::MySQLException &e) {std::cout << "MySQL Exception: " << e.message() << std::endl;root.set("status", -600);root.set("message", "MySQL Exception: " + e.message());Poco::JSON::Stringifier::stringify(root, ss);os << ss.str();} catch (const Poco::Exception &e) {std::cout << "Poco Exception: " << e.message() << std::endl;root.set("status", -200);root.set("message", "Poco Exception: " + e.message());Poco::JSON::Stringifier::stringify(root, ss);os << ss.str();} catch (const std::exception &e) {std::cout << "Std Exception: " << e.what() << std::endl;root.set("status", -300);root.set("message", "Std Exception: " + std::string(e.what()));Poco::JSON::Stringifier::stringify(root, ss);os << ss.str();}}
};#endif //POCO_HTTP_SERVER_UPDATEREQUESTHANDLER_H

注:为什么用3个异常处理?

1、如果JSON格式出错理论上你需要对每个传进来的JSON值进行两步校验,即是否存在这个keyvalue是否是你需要的类型,否则一旦出错就会出现崩溃的风险,不要抱侥幸心理认为只要传值的人不犯错就没事,你是服务者,你要做的就是一定不能出错,至少不能崩溃,最差的情况哪怕HTTP请求超时也不是不能接受。

2、本身Poco框架就刻意简化了处理方式,比如Poco::Exception可以捕捉所有的JSON错误(不止JSON,可以看下源码类层次),哪怕传过来的是空字符串e.message()可以获取具体的错误信息,将这个信息反回即可。哪怕你默认的请求是POST,别人给你传了GET,这段代码也是可以正常运行的,它会报错,但是美中不足的是报错的原因无法看出是Method的问题,这一点我觉得无关紧要,这肯定是请求者的问题,我不可能考虑的面面俱到。同样,Poco框架虽然提供了获取Method的方法,但是它没有过度区分到底是POST还是GET,而是把它归到了一起由开发者来决定处理方法,况且区分Method也是对请求人的硬性要求。

3、Poco::Data::MySQL::MySQLException捕捉数据库相关异常,但是注意:捕捉不了所有的CIUD结果,有些结果不触发异常,比如UPDATE语句,statement << "UPDATE student SET class_id=? WHERE id=?", use(class_id), use(id);这句的执行结果可能不成功,但是它可能不抛异常,可以通过返回影响行数来判断语句是否成功。std::exception能捕捉任何运行时异常,是最后的保命手段。不要担心异常会影响性能,异常对性能最大的影响是触发时的堆栈展开(stack unwinding),但是堆栈展开只有异常发生的时候才会触发,很多编译器对异常有优化,没有触发异常的语句可以获得近乎原生的性能,所以大胆地使用异常吧,但不要滥用。


总结

1、最后的总结才是最核心的部分,特别适合初学者,能少走很多弯路。

相关文章:

C++ Poco服务端框架中JSON的使用

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、JSON是什么&#xff1f;二、使用步骤总结 前言 上面一篇文章教你学会了Poco开发服务端应用&#xff0c;这个教程教会你使用JSON。一般传JSON的时候都是POS…...

leetcode787. K 站中转内最便宜的航班——优先队列优化的Dijkstra算法+剪枝

题目 leetcode787. K 站中转内最便宜的航班 题目分析 给定一个城市图&#xff0c;每个城市通过航班与其他城市相连。每个航班都有一个起点、终点和价格。你需要找到从起点城市 src 到终点城市 dst 的最便宜路径&#xff0c;但这条路径最多只能经过 k 个中转站。你需要返回这…...

赛盈分销亮相AI科技大会暨亚马逊新增长大会,与企业共话跨境品牌发展新机遇!

八月开端&#xff0c;由知无不言与xmars和钱老师课堂联合主办的2024年AI科技大会暨亚马逊新增长大会在深圳宝安顺利开展&#xff0c;为期2天的跨境峰会吸引了上千位优秀的卖家朋友前来感受一场盛夏大狂欢。在本次跨境峰会里&#xff0c;邀请了多位不同领域的先锋人物&#xff0…...

Nacos-配置中心

1.为什么要使用配置中心&#xff1f; 2.常用的配置中心组件&#xff1f; 3.如何使用&#xff1f; 在配置中心创建配置文件 启动一个单列的nacos服务 点击发布 在微服务中使用 添加依赖 <!--nacso配置中心的依赖--><dependency><groupId>com.alibaba.cloud&l…...

ava中的文件操作、IO流、递归和字符集

目录 File类的使用 创建File对象 创建和删除文件 遍历文件夹 IO流 字节流 读取文件 字符流 读取文本文件 写入文本文件 递归 计算阶乘 文件搜索 字符集 编码与解码 File类的使用 在Java中&#xff0c;File类用于表示文件和目录的路径。它提供了一些方法来创建、删…...

生成式人工智能安全评估体系构建

文章目录 前言一、人工智能安全治理的现状1.1 国际安全治理现状1.2 国内安全治理现状二、构建人工智能安全评估体系1.1 需要对生成式人工智能技术的安全性、可靠性、可控性、公平性等维度进行全面的考量。1.2 应对生成式人工智能全维度风险。1.3 在体系化应对框架中,应明确法律…...

NRBO-XGBoost分类 基于牛顿-拉夫逊优化算法[24年最新算法]-XGBoost多特征分类预测+交叉验证

NRBO-XGBoost分类 基于牛顿-拉夫逊优化算法[24年最新算法]-XGBoost多特征分类预测交叉验证 多输入单输出&#xff09; matlab代码 程序已调试好&#xff0c;无需更改代码替换数据直接使用&#xff01;&#xff01;&#xff01;数据格式为excel格式&#xff01;需要定制可私&a…...

synchronized实现原理及优化

一、概述 线程安全在并发编程中是重要关注点&#xff0c;造成线程安全问题的主要诱因有两个&#xff1a;一是存在共享数据&#xff08;也称临界资源&#xff09;&#xff0c;二是存在多个线程共同操作共享数据。synchronized关键字能够保证在同一时刻只有一个线程可以执行某个…...

NLP 之词的表示与语言模型

表示的基本原理&#xff1a; 机器无法理解文字&#xff0c;却能进行复杂的数学运算——神经网络只要够深、够复杂&#xff0c;就能拟合足够复杂的数学模式。把文字嵌入&#xff08;embed&#xff09;到一个向量空间中去。 词表示&#xff08;Word Representation&#xff09;…...

每天一个数据分析题(四百七十一)- 假设检验

下列对假设检验的描述合理的是? A. 备择假设是研究者想收集证据予以支持的假设 B. 原假设是研究者想收集证据予以推翻的假设 C. 原假设是研究者想收集证据予以支持的假设 D. 备择假设是研究者想收集证据予以推翻的假设 数据分析认证考试介绍&#xff1a;点击进入 题目来…...

《系统架构设计师教程(第2版)》第13章-层次式架构设计理论与实践-04-数据访问层设计

文章目录 1. 五种数据访问模式1.1 在线访问1.2 DAO1.3 DTO1.4 离线数据模式1.5 对象/关系映射 (O/R Mapping) 2. 工厂方法模式在数据访问层应用3 ORM、Hibernate与CMP2.0设计思想3.1 ORM3.2 Hibernate1&#xff09;概述2&#xff09; Hibernate的架构&#xff08;2023年的考题&…...

【视觉SLAM】 十四讲ch7习题

简介 本文主要内容是《视觉SLAM十四讲》&#xff08;第二版&#xff09;第7章的习题解答&#xff0c;并介绍了在解答习题中的一下思考和总结的经验。本文代码部分参考了&#xff1a;HW-of-SLAMBOOK2 1、除了本书介绍的ORB特征点&#xff0c;你还能找到哪些特征点&#xff1f;…...

K-近邻算法(二)

三、 kd 树 问题导⼊&#xff1a; 实现k 近邻算法时&#xff0c; 主要考虑的问题是如何对训练数据进⾏快速 k 近邻搜索。这在特征空间的维数⼤及训练数据容量⼤时尤其必要。 k 近邻法最简单的实现是线性扫描&#xff08;穷举搜索&#xff09;&#xff0c;即要计算输⼊实例与…...

WPF学习(2)-UniformGrid控件(均分布局)+StackPanel控件(栈式布局)

UniformGrid控件&#xff08;均分布局&#xff09; UniformGrid和Grid有些相似&#xff0c;只不过UniformGrid的每个单元格面积都是相等的&#xff0c;不管是横向的单元格&#xff0c;或是纵向的单元格&#xff0c;它们会平分整个UniformGrid。 UniformGrid控件提供了3个属性…...

ANTSDR E310

ANTSDR E310是一款由微相科技有限公司&#xff08;MicroPhase&#xff09;推出的软件无线电&#xff08;SDR&#xff09;平台&#xff0c;专为现场部署设计。以下是对ANTSDR E310的详细介绍&#xff1a; 一、主要特点 独立运行的软件无线电&#xff1a;ANTSDR E310具备独立运…...

MySQL 5.7 DDL 与 GH-OST 对比分析

作者&#xff1a;来自 vivo 互联网存储研发团队- Xia Qianyong 本文首先介绍MySQL 5.7 DDL以及GH-OST的原理&#xff0c;然后从效率、空间占用、锁阻塞、binlog日志产生量、主备延时等方面&#xff0c;对比GH-OST和MySQL5.7 DDL的差异。 一、背景介绍 在 MySQL 数据库中&…...

【Python】爬取网易新闻今日热点列表数据并导出

1. 需求 从网易新闻的科技模块爬取今日热点的列表数据&#xff0c;其中包括标题、图片、标签、发表时间、路径、详细文本内容&#xff0c;最后导出这些列表数据到Excel中。 网易科技新闻网址&#xff1a;https://tech.163.com 2. 解决步骤 2.1 前期准备 爬虫脚本中需要引用…...

软件设计之HTML5

软件设计之HTML5 【狂神说Java】HTML5完整教学通俗易懂 学习内容&#xff1a; 软件开发技能点参照&#xff1a;软件开发&#xff0c;小白变大佬&#xff0c;这套学习路线让你少走弯路是认真的&#xff0c;欢迎讨论 软件开发技能点参照&#xff1a;Java学习完整路线&#xff…...

CnosDB 元数据集群 – 分布式时序数据库的大脑

CnosDB 是一个分布式时序数据库系统&#xff0c;其中元数据集群是核心组件之一&#xff0c;负责管理整个集群的元数据信息。 1. 概述 CnosDB 是一个分布式时序数据库系统&#xff0c;其中元数据集群是核心组件之一&#xff0c;负责管理整个集群的元数据信息。元数据包括数据库…...

白骑士的Matlab教学进阶篇 2.5 Simulink

Simulink是MATLAB的扩展工具&#xff0c;提供了一个图形化的建模和仿真环境。它广泛应用于系统设计、仿真、自动控制、信号处理等领域。本文将详细介绍Simulink的简介与基本使用、建立与仿真模型、控制系统设计与仿真、与MATLAB的集成。 Simulink简介与基本使用 什么是Simuli…...

TlbbGmTool:重构游戏管理体验的5大架构创新解析

TlbbGmTool&#xff1a;重构游戏管理体验的5大架构创新解析 【免费下载链接】TlbbGmTool 某网络游戏的单机版本GM工具 项目地址: https://gitcode.com/gh_mirrors/tl/TlbbGmTool 从命令行困境到可视化治理的游戏运维实践指南 一、价值定位&#xff1a;重新定义游戏管理…...

PlatformIO+ESP32S3:像素时钟的硬件优化与实战解析

1. 从零开始&#xff1a;像素时钟的硬件架构解析 第一次接触ESP32S3开发像素时钟时&#xff0c;我完全低估了硬件设计的复杂度。这个看似简单的项目实际上涉及电源管理、实时时钟、LED驱动等多个子系统的协同工作。让我用最直白的语言拆解这个硬件拼图&#xff1a;核心就像搭积…...

Unity游戏自动翻译插件XUnity.AutoTranslator:打破语言壁垒的终极解决方案

Unity游戏自动翻译插件XUnity.AutoTranslator&#xff1a;打破语言壁垒的终极解决方案 【免费下载链接】XUnity.AutoTranslator 项目地址: https://gitcode.com/gh_mirrors/xu/XUnity.AutoTranslator XUnity.AutoTranslator是一款功能强大的开源Unity游戏自动翻译插件&…...

如何用League Director制作电影级英雄联盟视频?6个专业技巧让你的录像脱颖而出

如何用League Director制作电影级英雄联盟视频&#xff1f;6个专业技巧让你的录像脱颖而出 【免费下载链接】leaguedirector League Director is a tool for staging and recording videos from League of Legends replays 项目地址: https://gitcode.com/gh_mirrors/le/leag…...

Stable Diffusion 3.5 FP8镜像部署避坑指南:常见问题一网打尽

Stable Diffusion 3.5 FP8镜像部署避坑指南&#xff1a;常见问题一网打尽 1. 镜像简介与核心优势 Stable Diffusion 3.5 FP8镜像基于官方SD3.5模型优化&#xff0c;通过FP8量化技术实现了显著性能提升。相比标准版本&#xff0c;这个镜像具有三大核心优势&#xff1a; 显存占…...

VSCode开发Mirage Flow应用的环境配置指南

VSCode开发Mirage Flow应用的环境配置指南 1. 环境准备与插件安装 在开始开发Mirage Flow应用之前&#xff0c;我们需要先配置好VSCode开发环境。VSCode作为一款轻量级但功能强大的代码编辑器&#xff0c;通过合适的插件配置可以大幅提升开发效率。 首先确保你已经安装了最新…...

24小时不间断运行:OpenClaw+Qwen3-32B的稳定性监测报告

24小时不间断运行&#xff1a;OpenClawQwen3-32B的稳定性监测报告 1. 测试背景与实验设计 去年12月&#xff0c;当我第一次在RTX4090D上部署Qwen3-32B模型时&#xff0c;就萌生了一个想法&#xff1a;能否让OpenClaw像人类助手一样持续稳定工作&#xff1f;这个看似简单的需求…...

GridPlayer:多视频同步播放的终极解决方案

GridPlayer&#xff1a;多视频同步播放的终极解决方案 【免费下载链接】gridplayer Play videos side-by-side 项目地址: https://gitcode.com/gh_mirrors/gr/gridplayer 在数字内容爆炸的时代&#xff0c;视频创作者、教育工作者和媒体分析师经常面临需要同时处理多个视…...

DAMO-YOLO代码实例:OpenCV-Python图像预处理与后处理结果渲染详解

DAMO-YOLO代码实例&#xff1a;OpenCV-Python图像预处理与后处理结果渲染详解 1. 引言&#xff1a;从炫酷界面到核心引擎 当你打开DAMO-YOLO的赛博朋克界面&#xff0c;看到霓虹绿的识别框在图片上闪烁时&#xff0c;有没有想过这背后发生了什么&#xff1f;那个漂亮的界面只…...

从理论到实践:深度解析神经协同过滤(NCF)模型架构与代码复现

1. 神经协同过滤(NCF)的前世今生 推荐系统就像一位贴心的私人助理&#xff0c;它通过分析你的历史行为&#xff0c;预测你可能喜欢的商品或内容。传统的协同过滤方法&#xff0c;比如矩阵分解(MF)&#xff0c;就像是给用户和物品打上简单的标签&#xff0c;然后计算它们之间的匹…...