从json到protobuf,接口效率的提升

news2025/4/13 13:57:22

在express开发的前后端调用中,express作为服务端是不二之选,它有一些很好用的body解析器来解析传入数据;而作为请求发起方,axios是非常方便的,这是一个很好的选择,它可以传输多种类型的数据给接收方。
通常我们用urlencoded和json传一些数据量小的信息是蛮不错的,但是如果数据量大的话,或者感觉编码效率低的话,可以考虑用blob或者arraybuffer,当然如果某些属性就是blob或者arraybuffer,直接传就好了,但是如果类似一些较大的json对象数组,类似数据库宽表的一页或者几页信息,真是占空间,自己设计转码还挺麻烦,有没有什么好的办法呢?
这里要推荐一下protobuf,protobuf 就是Protocol Buffer,它是一种由 Google 开发的二进制序列化格式和相关的技术,它用于高效地序列化和反序列化结构化数据,大名鼎鼎的gRPC里用的就是这个。当然在本文里,我不是让你放弃express+axios,彻底转向gRPC的怀抱,而是利用protobuf来提高我们接口的传输效率。
首先,需要定义下接口数据格式,用proto定义比json更为精准,每条数据的各属性类型顺序,如果支持一个请求里传输多条数据,只需要来一个repeated定义即可。

//dgiij.proto
package dgiijpackage;
syntax = "proto3";

message welcomeMessage {
	string id = 1;
	int64 timecount = 2;
	string url = 3;
}

message msgs
{
    repeated welcomeMessage msg = 1;
}

在原接口请求方和服务方简单增加两句,用于在数据发送前和收到后,进行转码和解码即可
下面是node客户端代码

//sender.js
const axios = require('axios');
var protobuf = require("protobufjs");
const root=protobuf.loadSync("dgiij.proto");
const dgiijMessage = root.lookupType("dgiijpackage.msgs");

let dataset=[{ "id": "dgiij","timecount":202407271054,"url":"https://blog.csdn.net/dgiij" },{ "id": "dgiij1","timecount":202407271134,"url":"https://blog.csdn.net/dgiij1" }];

var messageout = dgiijMessage.create({"msg":dataset});
var buffer = dgiijMessage.encode(messageout).finish();
 
axios.post('http://localhost:3000/sendmsg',buffer,{ headers: {'Content-Type': 'application/octet-stream'}}).then(res=>console.log(res.data))

axios.get('http://localhost:3000/getmsg',{responseType:'arraybuffer'}).then(res=>{
	let messagein = dgiijMessage.decode(res.data);
	console.log("解码数据为:");
	console.log(messagein.msg)
	messagein.msg.forEach(item=>{item.pasrelong=item.timecount.toNumber()})
	console.log("long类型转数字后数据为:");
	console.log(messagein.msg)
	})


下面是node服务端代码

//receiver.js
const protobuf = require("protobufjs");
const root=protobuf.loadSync("dgiij.proto");
const dgiijMessage = root.lookupType("dgiijpackage.msgs");

const express = require('express');
const app = express();

app.use("/", express.static("./"));

app.post('/sendmsg',express.raw(), (req, res)=> {
	let message = dgiijMessage.decode(req.body);
	console.log("解码数据为:");
	console.log(message.msg)
	message.msg.forEach(item=>{item.pasrelong=item.timecount.toNumber()})
	console.log("long类型转数字后数据为:");
	console.log(message.msg)
	res.json({"msg":"got"});
})

app.get('/getmsg', (req, res)=> {

let dataset=[{ "id": "dgiij","timecount":202407271054,"url":"https://blog.csdn.net/dgiij" },{ "id": "dgiij1","timecount":202407271134,"url":"https://blog.csdn.net/dgiij1" }];

var message = dgiijMessage.create({"msg":dataset});
var buffer = dgiijMessage.encode(message).finish();

res.set('Content-Type', 'arrarybuffer');
res.write(buffer);
res.end();
})


app.listen(3000, ()=> {
	console.log("Server is listening");
});

运行结果如下

在这里插入图片描述
在这里插入图片描述
下面这个是浏览器端测试网页

<html>
<head>
<script src="axios.min.js"></script>
<script src="protobuf.js"></script>
</head>
<body>
<div>protobuf test</div>
<script>
protobuf.load("./dgiij.proto").then(root=>{

const dgiijMessage = root.lookupType("dgiijpackage.msgs");

let dataset=[{ "id": "dgiij","timecount":202407271054,"url":"https://blog.csdn.net/dgiij" },{ "id": "dgiij1","timecount":202407271134,"url":"https://blog.csdn.net/dgiij1" }];
let messageout = dgiijMessage.create({"msg":dataset});
let buffer = dgiijMessage.encode(messageout).finish();
 
axios.post('http://localhost:3000/sendmsg',buffer,{ headers: {'Content-Type': 'application/octet-stream'}}).then(res=>console.log(res.data));

axios.get('http://localhost:3000/getmsg',{responseType:'arraybuffer'}).then(res=>{
	let messagein = dgiijMessage.decode(new Uint8Array(res.data));
	console.log(messagein.msg)
	})
});
</script>
</body>
</html>

效果如下
在这里插入图片描述
提醒注意下:浏览器端调用发送数据跟后端没有区别,但是接收数据的话要将返回数据按Uint8Array来解码,否则会报错,另外解码后的long型数字也不用转换了。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1954737.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

ios生成打包证书和描述文件(保姆级)

苹果开发者地址&#xff1a;Apple Developer (简体中文) 1.申请苹果App ID(App的唯一标识) 选择App IDs 选择App 输入APP ID的描述和Bundle ID Explicit&#xff1a;唯一的ID&#xff0c;用于唯一标识一个应用程序&#xff0c;一般选Explicit WildCard&#xff1a;通配符ID&am…

【初阶数据结构篇】顺序表和链表算法题

文章目录 顺序表算法题移除元素删除有序数组中的重复项合并两个有序数组 链表算法题移除链表元素反转链表链表的中间结点合并两个有序链表链表分割链表的回文结构 顺序表算法题 不熟悉顺序表的可以先了解一下 顺序表实现方法 移除元素 给你一个数组 nums 和一个值 val&#x…

谷歌DeepMind的AlphaProof和AlphaGeometry 2:AI系统在国际数学奥林匹克竞赛中取得突破

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…

管不住人,你就当不好官:一流高手的3大管人秘籍,价值千金

管不住人&#xff0c;你就当不好官&#xff1a;一流高手的3大管人秘籍&#xff0c;价值千金 秘籍一&#xff1a;睁眼法 古语有云&#xff1a;“水至清则无鱼&#xff0c;人至察则无友。” 驾驭下属&#xff0c;学会睁一只眼闭一只眼&#xff0c;不要一竿子打死&#xff0c;…

如何在GPU服务器上安装Stable Diffusion webUI

一、前提条件 1、硬件条件 GPU&#xff1a;12G&#xff0c;建议16G以上&#xff0c;还是尽量勾搭&#xff0c;好像现在最大32G&#xff0c;目前个人性价比24G有时长出售。 内存&#xff1a;16G以上&#xff0c;建议32G&#xff0c;也是越大越好。 硬盘&#xff1a;最好使用…

谈谈面向对象

引言 无论你是刚入门的程序小白&#xff0c;还是混迹社会多年的程序大佬&#xff0c;谈起面向对象&#xff0c;想必多多少少都能侃上两句。面向对象作为程序界“家喻户晓”的一种编程思想&#xff0c;亦或是一种程序设计方法&#xff0c;重要性已是不言而喻。毫不夸张的说&…

打卡第22天------回溯算法

开始学习了,希望我可以尽快成功上岸! 一、回溯理论基础 什么是回溯法?回溯法也可以叫做回溯搜索法,它是一种搜索的方式。 回溯是递归的副产品,只要有递归就会有回溯。 回溯法的效率回溯法的本质是穷举,穷举所有可能,然后找出我们想要的答案。如果想让回溯法高效一些,可…

160. 相交链表(返回相交起点)

思路&#xff1a; 前提&#xff1a; PA headA&#xff0c;PB headB (B链表头节点) 过程&#xff1a; 1.PA与PB同时向后遍历 2.若PA遍历完&#xff0c;PA headB PB遍历完&#xff0c;PB headA 3.直到PA与PB指向相同节点&#xff08;实际遍历过两次中的较短的链表即可&am…

LLM与搜索推荐

重磅推荐专栏: 《大模型AIGC》 《课程大纲》 《知识星球》 本专栏致力于探索和讨论当今最前沿的技术趋势和应用领域,包括但不限于ChatGPT和Stable Diffusion等。我们将深入研究大型模型的开发和应用,以及与之相关的人工智能生成内容(AIGC)技术。通过深入的技术解析和实践经…

24款奔驰E260后排电动座椅升级,舒适度全面提升

以下是关于 24 款奔驰 E 升级原厂后排电动座椅功能的案例讲解&#xff1a; 升级原厂后排电动座椅通常需要直接替换整个后排座椅&#xff0c;包括扶手等部件。 后排电动座椅的好处是可以通过电机调节靠背角度和座椅前后移动。例如&#xff0c;乘客可以通过车门上的座椅调节按钮…

聚焦民生服务 助力企业发展 区块链应用加速落地

聚焦民生服务&#xff0c;助力企业发展&#xff0c;区块链应用正在加速落地。这一趋势体现了区块链技术在多个领域的广泛应用和深远影响。以下是对这一主题的详细分析&#xff1a; 一、区块链在民生服务中的应用 政务服务 数据共享与打通&#xff1a;区块链技术利用其分布式账…

征服 Docker 镜像访问限制:KubeSphere v3.4.1 成功部署全攻略

近期&#xff0c;KubeSphere 社区的讨论中频繁出现关于 Docker 官方镜像仓库访问受限的问题。 本文旨在为您提供一个详细的指南&#xff0c; 展示在 Docker 官方镜像访问受限的情况下&#xff0c;如何通过 KubeKey v3.1.2 一次性成功部署 KubeSphere v3.4.1 以及 Kubernetes …

Java二叉树三序遍历的非递归实现

目录 零、本文中模拟实现的二叉树源码 一、前序遍历的非递归实现 1.代码示例&#xff1a; 2.与递归算法的比对演示&#xff1a; 二、中序遍历的非递归实现 1.代码示例&#xff1a; 2.与递归算法的比对演示&#xff1a; 三、后序遍历的非递归实现 1.代码示例&#xff1a; 2.与递…

VScode连接算力云服务器

打开VScode,找到插件市场,搜索Remote - SSH 下载插件Remote - SSH之后会出现下面这个,直接点击。 将下面这个恒源云租服务器的登陆指令 复制到下面之中,enter确认。 然后点第一个 然后点这个 复制粘贴这个云服务器的密码,(它不会显示,但你已经粘贴了)

Paddlenlp测试

1、环境安装 使用华为云euleros操作系统&#xff0c;python版本3.9.5&#xff0c;CPU无GPU服务器&#xff1a; &#xff08;1&#xff09;pip3 install setuptools_scm -i http://mirrors.aliyun.com/pypi/simple/ --trusted-host mirrors.aliyun.com &#xff08;2&#xf…

js 替换json中的转义字符 \

例如有以下字符串 "\"{\\\"account\\\":\\\"66\\\",\\\"name\\\":\\\"66\\\"}\"" 想得到如下字符串 {"account":"66","name":"66"} 执行替换字符串 "\"{…

【科研绘图】记录一次论文结果复现

复现原论文中的图片是科研的基本功之一&#xff0c;它不仅验证了研究结果的可靠性&#xff0c;确保了科学工作的准确性和可重复性&#xff0c;还深刻地评估了方法的有效性&#xff0c;体现了对原始研究的尊重和对科学过程的严谨态度。这个过程不仅提高了研究的透明度&#xff0…

科普文:docker基础概念、软件安装和常用命令

docker基本概念 一 容器的概念 1. 什么是容器&#xff1a;容器是在隔离的环境里面运行的一个进程&#xff0c;这个隔离的环境有自己的系统目录文件&#xff0c;有自己的ip地址&#xff0c;主机名等。也可以说&#xff1a;容器是一种轻量级虚拟化的技术。 2. 容器相对于kvm虚…

计算机组成原理--慕课网学习笔记

本文记录了学习慕课网课程【新版】计算机基础&#xff0c;计算机组成原理操作系统网络时的计算机组成原理篇的笔记&#xff0c;方便查阅复习使用 一、概述篇 1.1 计算机的发展历史 1&#xff09;计算机发展的四个阶段 ①第一个阶段&#xff1a;电子管计算机 背景&#xff1a…

一文掌握什么是时间序列?时间序列研究的核心任务?目前最强大的时序分析与建模工具和项目?

🍉 CSDN 叶庭云:https://yetingyun.blog.csdn.net/ 什么是时间序列? 时间序列是一系列按照时间顺序排列的数据点,这些数据点通常是随时间连续变化的测量值。时间序列分析是统计学中专门用于解析时间顺序数据的一套技术,旨在识别数据中的模式、趋势、季节性波动及其他潜在…