成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

基于http協(xié)議使用protobuf進(jìn)行前后端交互

hersion / 2002人閱讀

摘要:呵呵呵打印出來的是二進(jìn)制流需要進(jìn)行化然后給前端。不然的話瀏覽器會自動解析成文字的前端需要進(jìn)行接受二進(jìn)制流先引入文件以及插件前端用請求的路由,在回調(diào)函數(shù)里的為后端的返回值。

protobuf介紹 由于網(wǎng)上關(guān)于protobuf的交互的資料比較零散,所以自己整理了一下關(guān)于protobuf前后端交互的資料,以作參考。

Google Protocol Buffers 簡稱 Protobuf,它提供了一種靈活、高效、自動序列化結(jié)構(gòu)數(shù)據(jù)的機(jī)制,可以聯(lián)想 XML,但是比 XML 更小、更快、更簡單。僅需要自定義一次你所需的數(shù)據(jù)格式,然后用戶就可以使用 Protobuf 編譯器自動生成各種語言的源碼,方便的讀寫用戶自定義的格式化的數(shù)據(jù)。與語言無關(guān),與平臺無關(guān),還可以在不破壞原數(shù)據(jù)格式的基礎(chǔ)上,依據(jù)老的數(shù)據(jù)格式,更新現(xiàn)有的數(shù)據(jù)格式。

前后端交互方式

前后端都是以二進(jìn)制形式進(jìn)行交互信息。前后端定義proto后綴的文件,以此文件來當(dāng)文檔來進(jìn)行溝通。

protobuf文件形式

以下為protobuf文件的demo,test.proto,文件的結(jié)構(gòu)確實(shí)簡單明了。

enum FOO {
  BAR = 1;
}

message Test {
  required float num  = 1;
  required string payload = 2;
  optional string payloads = 3;
}

message AnotherOne {
  repeated FOO list = 1;
}
前后端進(jìn)行protobuf的環(huán)境安裝

后端以node為例子:
安裝bufferhelper以及protocol-buffers進(jìn)行解析protobuf文件

npm install bufferhelper
npm install protocol-buffers

前端需要安裝解析protobuf的環(huán)境。
mac使用brew安裝protobuf環(huán)境。此操作需要先安裝Homebrew環(huán)境。具體的Homebrew的安裝自行搜索。
windows的前端環(huán)境安裝有點(diǎn)不一樣,自行搜索。

brew install protobuf

測試前端proto環(huán)境是不是安裝好了,如果有版本就是安裝好了。

protoc --version

在進(jìn)行前后端交互之前,前端需要進(jìn)行編譯proto文件。
test.proto為前端以及后端相同的proto文件。先編譯為js文件再執(zhí)行。首先進(jìn)入node項(xiàng)目的proto的目錄下面,執(zhí)行下面的命令之后會生成test_pb.js文件。最后js只需要解析這個文件即可。前端也需要執(zhí)行這樣的操作,因?yàn)槲疫@邊是前后端分離的。是兩個項(xiàng)目,所以兩個項(xiàng)目都需要編譯。

protoc --js_out=import_style=commonjs,binary:. test.proto
后端給前端傳數(shù)據(jù)

后端賦值proto文件的內(nèi)容并傳給前端。
后端傳protobuf二進(jìn)制給前端,要先轉(zhuǎn)化為json才可以給前端。不然的話前端會轉(zhuǎn)化成亂碼的。前端需要請求此路由。

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) // 打印出來的是二進(jìn)制流
  res.send(JSON.stringify(buf)); //需要進(jìn)行json化然后給前端。不然的話瀏覽器會自動解析成文字的
})

前端需要進(jìn)行接受二進(jìn)制流
先引入proto.js文件以及protobufjs插件

  import awesome from "../../proto/test_pb.js"

前端用axios請求/proto/get的路由,在回調(diào)函數(shù)里的res.data為后端的返回值。進(jìn)行以下操作。打印出來的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)
    })
前端給后端傳數(shù)據(jù)

前端需要進(jìn)行proto文件的賦值以及轉(zhuǎn)換為二進(jìn)制給后端
引入需要依賴的文件。

  import awesome from "../../proto/test_pb.js"
  import protobuf from "protobufjs"
     let message = new awesome.Test() // 調(diào)用Person對象  實(shí)例化
    // 賦值
    message.setNum(23)
    message.setPayload("asd")
    // 序列化
    let bytes = message.serializeBinary() //  字節(jié)流
    let blob = new Blob([bytes], {type: "buffer"});
    axios({
      method:"post",
      url: "/proto/send",
      data: blob,
      headers: {
        "Content-Type": "application/octet-stream" // 這里根據(jù)后臺要求進(jìn)行設(shè)置的,如果沒有要求應(yīng)該是 application/octet-stream (二進(jìn)制流)
      }
    }).then(res => {
      console.log(res)
    }).catch((error) => {
      console.log(error)
    })

后端需要接受文件
引入文件

let BufferHelper = require("bufferhelper");

接收字節(jié)流的代碼

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) // 這里已經(jīng)就是二進(jìn)制文件了
    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
  });
})

以上就是關(guān)于protobuf的前后交互。如有錯誤,請指出。

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/101702.html

相關(guān)文章

  • 精讀《REST, GraphQL, Webhooks, & gRPC 如何選型》

    摘要:而利用進(jìn)一步提高了序列化速度,降低了數(shù)據(jù)包大小。帶來的最大好處是精簡請求響應(yīng)內(nèi)容,不會出現(xiàn)冗余字段,前端可以決定后端返回什么數(shù)據(jù)。再次強(qiáng)調(diào),相比和,是由前端決定返回結(jié)果的反模式。請求者可以自定義返回格式,某些程度上可以減少前后端聯(lián)調(diào)成本。 1 引言 每當(dāng)項(xiàng)目進(jìn)入聯(lián)調(diào)階段,或者提前約定接口時,前后端就會聚在一起熱火朝天的討論起來。可能 99% 的場景都在約定 Http 接口,討論 URL...

    DevWiki 評論0 收藏0
  • 帶入gRPC:gRPC及相關(guān)介紹

    摘要:原文地址帶入及相關(guān)介紹項(xiàng)目地址作為開篇章,將會介紹相關(guān)的一些知識。 原文地址:帶入gRPC:gRPC及相關(guān)介紹 項(xiàng)目地址:go-grpc-example 作為開篇章,將會介紹 gRPC 相關(guān)的一些知識。簡單來講 gRPC 是一個 基于 HTTP/2 協(xié)議設(shè)計(jì)的 RPC 框架,它采用了 Protobuf 作為 IDL 你是否有過疑惑,它們都是些什么?本文將會介紹一些常用的知識和概念,更詳...

    y1chuan 評論0 收藏0
  • 帶入gRPC:gRPC及相關(guān)介紹

    摘要:帶入及相關(guān)介紹原文地址帶入及相關(guān)介紹項(xiàng)目地址作為開篇章,將會介紹相關(guān)的一些知識。 帶入gRPC:gRPC及相關(guān)介紹 原文地址:帶入gRPC:gRPC及相關(guān)介紹 項(xiàng)目地址:go-grpc-example 作為開篇章,將會介紹 gRPC 相關(guān)的一些知識。簡單來講 gRPC 是一個 基于 HTTP/2 協(xié)議設(shè)計(jì)的 RPC 框架,它采用了 Protobuf 作為 IDL 你是否有過疑惑,它們都...

    AJie 評論0 收藏0
  • 基于 protobuf 協(xié)議實(shí)現(xiàn)高性能的 IM 客戶

    摘要:涉及到計(jì)算機(jī)基礎(chǔ)知識,例如字節(jié)緩沖大小端等。是指用多少位表示的整數(shù),例如就是用位即一個字節(jié)表示的整數(shù),二進(jìn)制范圍是,對應(yīng)的十進(jìn)制就是。開發(fā)時通訊雙方或者多方終端都遵循協(xié)議。 這里記錄了使用 protobuf 協(xié)議與服務(wù)端數(shù)據(jù)交互的相關(guān)內(nèi)容和知識。涉及到計(jì)算機(jī)基礎(chǔ)知識,例如字節(jié)、buffer 緩沖、大小端等。 字節(jié) / Byte 1 字節(jié)代表了 8 位(bit)二進(jìn)制,1 位就是 0...

    ssshooter 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<