+
95
-

回答

主要步骤:

定义user.proto消息类型

编译成浏览器可运行的proto文件

在浏览器使用user.js生成Protobuf对象

序列化为二进制 data

发送 data 到PHP

PHP使用Protobuf库解析二进制数据,反序列化为User对象

从User对象中取出字段值

1、下载google的protobuf的compiler,通过编译器可以将.proto文件转换为想要的语言文件。

下载地址:https://repo1.maven.org/maven2/com/google/protobuf/protoc/

我使用这个

800_auto

2、新建一个user.proto:

syntax = "proto3";
message User {
string name = 1;
int32 age = 2;
}

3、转换 

protoc-4.0.0-rc-2-windows-x86_64 --js_out=import_style=commonjs,binary:. user.proto

生成user_pb.js,如果是node.js的话就直接可以使用了,但是想在浏览器中使用还需要做一些处理

800_auto

4、安装相关的nodejs库

npm install -g require(对库文件的引用库)
npm install -g browserify(这个是用来打包成前端使用的js文件)
npm install google-protobuf

5、新建一个exports.js

var UserBody = require('./user_pb');  

module.exports = {
DataProto: UserBody
}

6、打包成浏览器可运行的js,执行命令

browserify exports.js > UserBody.js

7、生成的UserBody就可以在浏览器使用了

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">

<script type="text/javascript" src="//repo.bfw.wiki/bfwrepo/js/UserBody.js"></script>
<script type="module">

// 引入proto.js
var Msg = proto.User;

var msg = new Msg();
msg.setName('John');

var data = msg.serializeBinary();

var xhr = new XMLHttpRequest();
xhr.open('POST', 'your.php');
xhr.send(data);


</script>

</head>
<body>

</body>
</html>

8、后端php
<?php
require 'vendor/autoload.php';
use Protobuf\Message;

class User extends Message {}

// 处理Protobuf请求
$data = file_get_contents('php://input');
$user = User::parseBinary($data);

$name = $user->getName();
$age = $user->getAge();


网友回复

我知道答案,我要回答