当前位置: 首页 > 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…...

基于FPGA的PID算法学习———实现PID比例控制算法

基于FPGA的PID算法学习 前言一、PID算法分析二、PID仿真分析1. PID代码2.PI代码3.P代码4.顶层5.测试文件6.仿真波形 总结 前言 学习内容&#xff1a;参考网站&#xff1a; PID算法控制 PID即&#xff1a;Proportional&#xff08;比例&#xff09;、Integral&#xff08;积分&…...

多场景 OkHttpClient 管理器 - Android 网络通信解决方案

下面是一个完整的 Android 实现&#xff0c;展示如何创建和管理多个 OkHttpClient 实例&#xff0c;分别用于长连接、普通 HTTP 请求和文件下载场景。 <?xml version"1.0" encoding"utf-8"?> <LinearLayout xmlns:android"http://schemas…...

STM32+rt-thread判断是否联网

一、根据NETDEV_FLAG_INTERNET_UP位判断 static bool is_conncected(void) {struct netdev *dev RT_NULL;dev netdev_get_first_by_flags(NETDEV_FLAG_INTERNET_UP);if (dev RT_NULL){printf("wait netdev internet up...");return false;}else{printf("loc…...

Springcloud:Eureka 高可用集群搭建实战(服务注册与发现的底层原理与避坑指南)

引言&#xff1a;为什么 Eureka 依然是存量系统的核心&#xff1f; 尽管 Nacos 等新注册中心崛起&#xff0c;但金融、电力等保守行业仍有大量系统运行在 Eureka 上。理解其高可用设计与自我保护机制&#xff0c;是保障分布式系统稳定的必修课。本文将手把手带你搭建生产级 Eur…...

大模型多显卡多服务器并行计算方法与实践指南

一、分布式训练概述 大规模语言模型的训练通常需要分布式计算技术,以解决单机资源不足的问题。分布式训练主要分为两种模式: 数据并行:将数据分片到不同设备,每个设备拥有完整的模型副本 模型并行:将模型分割到不同设备,每个设备处理部分模型计算 现代大模型训练通常结合…...

c#开发AI模型对话

AI模型 前面已经介绍了一般AI模型本地部署&#xff0c;直接调用现成的模型数据。这里主要讲述讲接口集成到我们自己的程序中使用方式。 微软提供了ML.NET来开发和使用AI模型&#xff0c;但是目前国内可能使用不多&#xff0c;至少实践例子很少看见。开发训练模型就不介绍了&am…...

是否存在路径(FIFOBB算法)

题目描述 一个具有 n 个顶点e条边的无向图&#xff0c;该图顶点的编号依次为0到n-1且不存在顶点与自身相连的边。请使用FIFOBB算法编写程序&#xff0c;确定是否存在从顶点 source到顶点 destination的路径。 输入 第一行两个整数&#xff0c;分别表示n 和 e 的值&#xff08;1…...

#Uniapp篇:chrome调试unapp适配

chrome调试设备----使用Android模拟机开发调试移动端页面 Chrome://inspect/#devices MuMu模拟器Edge浏览器&#xff1a;Android原生APP嵌入的H5页面元素定位 chrome://inspect/#devices uniapp单位适配 根路径下 postcss.config.js 需要装这些插件 “postcss”: “^8.5.…...

C++:多态机制详解

目录 一. 多态的概念 1.静态多态&#xff08;编译时多态&#xff09; 二.动态多态的定义及实现 1.多态的构成条件 2.虚函数 3.虚函数的重写/覆盖 4.虚函数重写的一些其他问题 1&#xff09;.协变 2&#xff09;.析构函数的重写 5.override 和 final关键字 1&#…...

Netty从入门到进阶(二)

二、Netty入门 1. 概述 1.1 Netty是什么 Netty is an asynchronous event-driven network application framework for rapid development of maintainable high performance protocol servers & clients. Netty是一个异步的、基于事件驱动的网络应用框架&#xff0c;用于…...