做个营销型网站,免费可信网站认证,如何做视频解析网站,一流的盘锦网站建设文章目录 json库粗略认识详细认识writer 类reader类jsoncpp序列化实现jsoncpp反序列化实现 bundle文件压缩库简单认识bundle库实现文件压缩bundle库实现文件解压缩 httplib库Request类Response类Server类Client类 json库
粗略认识
json是一种数据交换格式#xff0c;采用完全… 文章目录 json库粗略认识详细认识writer 类reader类jsoncpp序列化实现jsoncpp反序列化实现 bundle文件压缩库简单认识bundle库实现文件压缩bundle库实现文件解压缩 httplib库Request类Response类Server类Client类 json库
粗略认识
json是一种数据交换格式采用完全独立于编程语言的文本格式来存储和表示数据 姓名是char类型、年龄是 int类型、 成绩是 float类型 json将多种数据类型对象 组织成为一个字符串
json数据类型对象、数组、字符串、数字 对象使用 {} 括起来的表示一个对象 如小明 和小黑 两个 学生信息对象
数组使用 [] 括起来的表示一个数组 如小明和小黑的成绩都有三个数用[] 括起来 表示一个数组
字符串使用 括起来的表示一个字符串 如小明和小黑的名字 使用双引号表示字符串
数字包括整形和浮点型 直接使用 如小明和小黑的年龄 可以直接 填入 即可 详细认识
jsoncpp库 用于实现 json格式 的序列化和反序列化完成将多个数据对象组织成为 json格式字符串 以及将json格式字符串 解析得到多个数据对象的功能
主要借助三个类以及对应的成员函数完成 该类中重载了 [] 和 两个运算符 好处是 进行数据存储时json::value类会保存所有的数据对象
也可以用 asString 寻找对应数据中属于string的部分 用 asInt 寻找对应数据中属于int的部分 writer 类
将json::value 对象中所保存的多个数据对象的数据 进行序列化 json_api writer json_api fastwriter 、 json_api styledwriter 作为低版本 使用低版本可能会报警告 json_api streamwriter json_api streanwriterbuilder 作为高版本 使用高版本则不会有警告 无论低版本还是高版本 都有 write 这个成员函数 传递一个 json::value的数据对象将这个对象中的所有的数据 按照 json格式 进行序列化 若为低版本则直接返回一个 json数据串 若为高版本则 将json 数据串 放入 流中 reader类 实现 json的反序列化 即 将json格式的字符串 反序列化 解析得到多个数据对象放入 json::value 对象中 反序列化的低版本 为 json_api reader 使用其中的 parse接口 第一个参数 decument 作用为 json格式的字符串 传入 第二个参数root 作用为 将反序列化得到的对象存放到 root中 反序列化的高版本 共有两种 charreader 和 charreaderbuilder
先通过 charreaderbuilder 类中的 newcharreader接口 实例化一个 charreader 对象 再去通过 调用charreader 类中的 parse 接口 第一个参数为 字符串的起始地址 第二个参数为字符串的结束地址 第三个参数为 json::value对象的指针 将字符串内容进行反序列化 放入 root中 若解析出错则会把错误信息 放入 第四个参数 errs中 jsoncpp序列化实现 假设有以上信息 1.需要先将数据保存到 json::value 对象中 2.想要使用 json::StreamWriter 进行序列化 就需要先借助 json::StreamWriterBuilder 实例化一个 StreamWriter对象 然后再使用 StreamWriter类中的 write接口 将数据串 放入流中 将上述信息放入主函数main中 在实例化一个 json::value类型的root对象将上面的的数据保存到root中 因为 json::value 重载了运算符所以基础数据是可以直接通过赋值来完成的 实例化一个 StreamWriterBuilder类型的对象 swb 再通过类中的newStreamWriter接口 实例化一个StreamWriter对象被命名为 sw 定义一个 stringstream 流 ss 在借助StreamWriter类中的 write接口将root中的数据串 传入 流中 最后打印流中的数据 输入 g json_example.cpp -o json_example -ljsoncpp 再次执行程序 将数据串 显示到流中 jsoncpp反序列化实现 string str “{“姓名”:“小黑”,“年龄”:19,“成绩”:[58.5,66,35.5]}”; {外的双引号 与 {内的双引号 有歧义 就需要用 \ 进行转义 表示用的是 原始的双引号 string strR({“姓名”:“小黑”,“年龄”:19,“成绩”:[58.5,66,35.5]})“; 若想简单写则可以使用C11中的特殊用法 R”( ) 表示括号内部都是原始字符串所有的字符都已经去除了特殊含义 jsoncpp中进行反序列化 是将字符串中的数据解析放到了 Json::Value 中 1.定义一个Json::Value对象 root 2. 想要使用 CharReader 进行反序列化 则需要先通过 CharReaderBuilder 实例化一个对象 CharReader 在调用 CharReader 的 parse接口 创建一个str字符串并且内部都是原始字符串 创建一个 json::value 类型的root对象 实例化一个 json::CharReader类型的对象 crb 再通过类中的 newCharReader接口 实例化一个CharReader 对象被命名为 cr 若ret为false则说明反序列化失败 若ret为true 则说明反序列化成功
root[“姓名”].asString() 表示 获取到 姓名对应数据中的string数据 所以使用 asString 表示 获取对应的string数据
root[“年龄”].asInt() 表示 获取到 年龄对应数据中的int数据 所以使用 asInt 表示 获取对应的int数据 反序列化后数据全部放入root中最终 将root对象中的数据全部打印出来 bundle文件压缩库
简单认识
bundleBundle 是一个嵌入式压缩库使用时只需要加入两个文件 bundle.h 和 bundle.cpp 即可 bundle库实现文件压缩
由于在之前已经安装过了 bundle库所以直接使用 bundle-master 将 bundle-master 中的 bundle.cpp 和 bundle.h 拷贝出来 当到当前目录中 从运行参数中获取到文件压缩的文件名和压缩包名称 打开原文件读取对应的数据再对其进行压缩
共有三个参数文件压缩 文件名和压缩包名称 如果agv小于3则表示参数个数不够则直接返回-1 iffilename表示文件名称 offilename表示压缩包的名称 使用ifstream文件流 创建变量ifs open打开原始文件打开的是输入文件 输入 ios::binary i以二进制形式打开文件 iseekg i 作用为跳转到读写位置到末尾 获取末尾偏移量 即文件长度 跳转到文件起始位置 创建一个字符串 body 调整body大小为文件大小 读取文件所有数据到 body中 选择 LZIP 压缩格式body作为文件内容使用 pack 进行压缩返回值就是压缩之后的数据 以输出文件流 ofstream 创建变量 ofs 以二进制的方式打开压缩包 文件 将压缩后的数据写入 压缩包文件中 执行compress可执行程序 即可运行出来 bundle.cpp文件大小为5.4M 通过compress 将其 进行压缩成 bundle.cpp.lz 再次查看发现bundle.cpp.lz大小为668K bundle库实现文件解压缩
将文件压缩后的 bundle.cpp.lz 进行解压 再将解压的文件与 bundle.cpp进行对比 共有三个参数文件压缩 压缩包名称和文件名称 如果agv小于3则表示参数个数不够则直接返回-1 以 istream文件流 创建变量 ifs 将filename文件 以二进制形式打开 使用 seekg 使 ifs 处于文件末尾 再通过 tellg 获取文件大小 最终通过 beg 跳转到 ifs文件的起始位置 创建一个字符串 body 调整body大小为文件大小 读取ifs文件所有数据到 body中 通过 bundle 库中的 unpack 进行解压缩 以 输出文件流ofstram 创建变量 ofs 以二进制形式将ofilename文件打开 将解压缩后的数据 全部放入 ofs文件 中 httplib库
httplib库 是一个c11单文件头的跨平台 HTTP/HTTPS库 只需包含 httplib.h 在代码中即可
实际用于搭建一个简单的http服务器或者客户端的库这种第三方库免去搭建服务器或客户端的时间提高开发效率 Request类 HTTP 首行 请求方法 URL 协议版本 头部key 与value 形成的KV模型 空行\r\n 正文提交给服务器的数据
请求方法中包含 GET获取资源 以及 POST提交表单数据 Request结构体的作用 1.客户端保存的所有http请求相关信息最终组织http请求发送给服务器 2.服务器收到http请求之后进行解析将解析的数据保存在request结构体中等待后续处理 MultipartFormDataMap 内部包含四个字段 name为字段名称 content为文件内容 filename为文件名称 coneent_type 为正文类型 has_header 查询头部字段 get_heaer_value 获取头部字段的值 set_header 设置头部字段的值 has_file 是否包含某个文件 get_file_value 获取文件信息 Response类 HTTP响应格式 首行协议版本 响应状态码 状态码描述 头部响应的关键性描述字段 key: value\r\n key:value\r\n 空行 \r\n 正文响应给客户端的数据 Response结构体功能 用户将响应数据放到结构体中httplib会将其中的数据按照http响应格式 组织成为http Server类
Server功能 用于搭建http服务器 listen作为搭建服务器并启动http服务器 handler是一个函数指针类型的业务处理函数定义了一个http请求处理回调函数格式 第一个参数 request 为 保存请求数据让用户能够根据请求数据进行业务处理 第二个参数 response 为 用户在业务处理中填充数据最终要响应给客户端
http搭建的服务器收到请求后进行解析得到一个Request结构体其中包含请求数据 根据请求数据 就可以将请求处理处理函数定义的格式为Handler格式 Handlers是 请求与处理函数映射表 为一个请求路由数组数组中包含两个信息 regex 为 正则表达式 用于匹配 http请求资源路径 Handler 为 请求处理函数指针 可以将 Handlers 看作一张表 映射了客户端请求的资源路径和一个处理函数(用户自己定义的函数)
当服务器收到请求解析得到 Request 就会根据 资源路径以及请求方法到这张表中查看有没有对应的处理函数 如果有则调用这个函数进行请求处理 如果没有则响应404 new_task_queue 作为一个线程池 用于处理请求 httplib 会收到一个新建 连接则将新的客户端连接抛入 线程池中
线程池中线程的工作 1.接收请求解析请求得到request结构体 即请求数据 2.在Handlers映射表中根据请求信息 查找处理函数如果有则调用函数处理如果没有则响应404 3.当处理函数调用完毕后根据函数返回的response结构体中的数据 组织 http响应 发送给客户端 Client类 Client类 用于搭建 http的客户端 GET 向服务器发送GET请求 传入的是 请求的资源路径和 头部字段
第一个POST 发送post请求 path为资源路径、body作为正文数据、length作为正文长度、content_type 作为 正文类型
第二个POST POST请求提交多区域数据 常用于多文件上传 path为资源路径 MultipartFormDataItems 是一个数组而items 为上传的文件信息