摘要:呵呵呵打印出來的是二進制流需要進行化然后給前端。不然的話瀏覽器會自動解析成文字的前端需要進行接受二進制流先引入文件以及插件前端用請求的路由,在回調函數里的為后端的返回值。
protobuf介紹 由于網上關于protobuf的交互的資料比較零散,所以自己整理了一下關于protobuf前后端交互的資料,以作參考。
Google Protocol Buffers 簡稱 Protobuf,它提供了一種靈活、高效、自動序列化結構數據的機制,可以聯想 XML,但是比 XML 更小、更快、更簡單。僅需要自定義一次你所需的數據格式,然后用戶就可以使用 Protobuf 編譯器自動生成各種語言的源碼,方便的讀寫用戶自定義的格式化的數據。與語言無關,與平臺無關,還可以在不破壞原數據格式的基礎上,依據老的數據格式,更新現有的數據格式。
前后端交互方式前后端都是以二進制形式進行交互信息。前后端定義proto后綴的文件,以此文件來當文檔來進行溝通。
protobuf文件形式以下為protobuf文件的demo,test.proto,文件的結構確實簡單明了。
enum FOO { BAR = 1; } message Test { required float num = 1; required string payload = 2; optional string payloads = 3; } message AnotherOne { repeated FOO list = 1; }前后端進行protobuf的環境安裝
后端以node為例子:
安裝bufferhelper以及protocol-buffers進行解析protobuf文件
npm install bufferhelper npm install protocol-buffers
前端需要安裝解析protobuf的環境。
mac使用brew安裝protobuf環境。此操作需要先安裝Homebrew環境。具體的Homebrew的安裝自行搜索。
windows的前端環境安裝有點不一樣,自行搜索。
brew install protobuf
測試前端proto環境是不是安裝好了,如果有版本就是安裝好了。
protoc --version
在進行前后端交互之前,前端需要進行編譯proto文件。
test.proto為前端以及后端相同的proto文件。先編譯為js文件再執行。首先進入node項目的proto的目錄下面,執行下面的命令之后會生成test_pb.js文件。最后js只需要解析這個文件即可。前端也需要執行這樣的操作,因為我這邊是前后端分離的。是兩個項目,所以兩個項目都需要編譯。
protoc --js_out=import_style=commonjs,binary:. test.proto后端給前端傳數據
后端賦值proto文件的內容并傳給前端。
后端傳protobuf二進制給前端,要先轉化為json才可以給前端。不然的話前端會轉化成亂碼的。前端需要請求此路由。
app.get("/proto/get", function (req, res) { let protobuf = require("protocol-buffers") let messages=protobuf(fs.readFileSync("./proto/test.proto") let buf = messages.Test.encode({ num: 42, payload: "hello world node js and javahhh呵呵呵", payloads: "" }) console.log(buf) // 打印出來的是二進制流 res.send(JSON.stringify(buf)); //需要進行json化然后給前端。不然的話瀏覽器會自動解析成文字的 })
前端需要進行接受二進制流
先引入proto.js文件以及protobufjs插件
import awesome from "../../proto/test_pb.js"
前端用axios請求/proto/get的路由,在回調函數里的res.data為后端的返回值。進行以下操作。打印出來的message3也是解析好的文件。
axios({ method:"get", url: "/proto/get", headers: { "contentType":"application/x-protobuf"} }).then(res => { let message3 = awesome.Test.deserializeBinary(res.data.data) let nums = message3.getNum() console.log(nums) // nums=42。解析出來就是后端傳過來的42 let pm = awesome.Test.deserializeBinary(res.data.data) let protoBuf = pm.toObject() console.log("protoBuf: ", protoBuf) // 打印出來是一個對象 }).catch((error) => { console.log(error) })前端給后端傳數據
前端需要進行proto文件的賦值以及轉換為二進制給后端
引入需要依賴的文件。
import awesome from "../../proto/test_pb.js" import protobuf from "protobufjs"
let message = new awesome.Test() // 調用Person對象 實例化 // 賦值 message.setNum(23) message.setPayload("asd") // 序列化 let bytes = message.serializeBinary() // 字節流 let blob = new Blob([bytes], {type: "buffer"}); axios({ method:"post", url: "/proto/send", data: blob, headers: { "Content-Type": "application/octet-stream" // 這里根據后臺要求進行設置的,如果沒有要求應該是 application/octet-stream (二進制流) } }).then(res => { console.log(res) }).catch((error) => { console.log(error) })
后端需要接受文件
引入文件
let BufferHelper = require("bufferhelper");
接收字節流的代碼
app.post("/proto/send", function (req, res) { let bufferHelper = new BufferHelper(); req.on("data", function (chunk) { bufferHelper.concat(chunk); }); req.on("end", function () { let protobuf = require("protocol-buffers") let buffer = bufferHelper.toBuffer(); console.log(buffer) // 這里已經就是二進制文件了 let message3 = awesome.Test.deserializeBinary(buffer) console.log(message3.getNum()) // 打印的就是前端傳的23 let pm = awesome.Test.deserializeBinary(buffer) let protoBuf = pm.toObject() console.log(protoBuf) // 打印的是{ num: 23, payload: "asd", payloads: "asds" } console.log(protoBuf.num) // 打印23 }); })
以上就是關于protobuf的前后交互。如有錯誤,請指出。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/101702.html
摘要:而利用進一步提高了序列化速度,降低了數據包大小。帶來的最大好處是精簡請求響應內容,不會出現冗余字段,前端可以決定后端返回什么數據。再次強調,相比和,是由前端決定返回結果的反模式。請求者可以自定義返回格式,某些程度上可以減少前后端聯調成本。 1 引言 每當項目進入聯調階段,或者提前約定接口時,前后端就會聚在一起熱火朝天的討論起來。可能 99% 的場景都在約定 Http 接口,討論 URL...
摘要:原文地址帶入及相關介紹項目地址作為開篇章,將會介紹相關的一些知識。 原文地址:帶入gRPC:gRPC及相關介紹 項目地址:go-grpc-example 作為開篇章,將會介紹 gRPC 相關的一些知識。簡單來講 gRPC 是一個 基于 HTTP/2 協議設計的 RPC 框架,它采用了 Protobuf 作為 IDL 你是否有過疑惑,它們都是些什么?本文將會介紹一些常用的知識和概念,更詳...
摘要:帶入及相關介紹原文地址帶入及相關介紹項目地址作為開篇章,將會介紹相關的一些知識。 帶入gRPC:gRPC及相關介紹 原文地址:帶入gRPC:gRPC及相關介紹 項目地址:go-grpc-example 作為開篇章,將會介紹 gRPC 相關的一些知識。簡單來講 gRPC 是一個 基于 HTTP/2 協議設計的 RPC 框架,它采用了 Protobuf 作為 IDL 你是否有過疑惑,它們都...
摘要:涉及到計算機基礎知識,例如字節緩沖大小端等。是指用多少位表示的整數,例如就是用位即一個字節表示的整數,二進制范圍是,對應的十進制就是。開發時通訊雙方或者多方終端都遵循協議。 這里記錄了使用 protobuf 協議與服務端數據交互的相關內容和知識。涉及到計算機基礎知識,例如字節、buffer 緩沖、大小端等。 字節 / Byte 1 字節代表了 8 位(bit)二進制,1 位就是 0...
閱讀 3513·2021-10-08 10:04
閱讀 863·2019-08-30 15:54
閱讀 2180·2019-08-29 16:09
閱讀 1347·2019-08-29 15:41
閱讀 2272·2019-08-29 11:01
閱讀 1735·2019-08-26 13:51
閱讀 1026·2019-08-26 13:25
閱讀 1806·2019-08-26 13:24