protobuf(二)springboot整合protobuf传输数据

具体实践

1、环境准备

  1. 后端
    见博客:protobuf(一)认识protobuf

  2. 前端
    1)nodejs: 官网下载;PS:本次我仍是利用浏览器作为js解释器
    2)protbufjs:https://github.com/protobufjs/protobuf.js

2、开发

定义传输内容

首先,写一个.proto文件
在这里插入图片描述

后端开发

  1. 将.proto编译为.java
  2. 采用springboot框架,在controller中写请求
  3. 配置protobuf序列化与反序列化
    @Configuration
    public class ProtobufConfig {
        // protobuf序列化
        @Bean
        ProtobufHttpMessageConverter protobufHttpMessageConverter() {
            return new ProtobufHttpMessageConverter();
        }
    
        // protobuf反序列化
        @Bean
        RestTemplate restTemplate(ProtobufHttpMessageConverter protobufHttpMessageConverter) {
            return new RestTemplate(Collections.singletonList(protobufHttpMessageConverter));
    	}
    }
    

前端开发

  1. 将.proto编译为.js
    i. 利用google-protobuf编译js
    a)利用npm全局安装google-protobuf
    npm install google-protobuf g
    b)编译

    protoc --js_out=import_style=commonjs,binary:. xxx.proto
    

    编译完成后会生成xxx_pb.js文件
    c)browserify再次打包
    因为编译出来的内容存在node组件的内容,而浏览器无法解析,故使用browserify将js再打包一次

    browserify A.js -o B.js
    

    1)A文件通常命名为export.js,内容如下:

    var MessageBody = require('./xxx_pb.js');
    module.exports = {
    	DataProto: MessageBody
    }
    

    xxx_pb.js是protoc编译的js文件
    2)B文件是browserify打包后会生成的js文件名

  2. 定义一个消息实例

    var userRegister = new proto.UserRegisterRequest();
    userRegister.setPhone("15211111111").setPassword("1234567");
    
  3. 实例序列化

    var bytes = userRegister.serializeBinary();
    
  4. 采用ajax发送请求

    $.ajax({
          method: 'post',
          url: '/user/register',
          data: bytes,
          responseType: 'arraybuffer',
          processData: true, //true为序列化
          contentType: 'application/x-protobuf'   //注意protobuf默认的contentType为application/x-protobuf
    }).then(res => {
         var arr = stringToBytes(res) //通过typeof发现res是string类型,需转换为type[]类型再反序列
         var tmp = proto.UserRegisterResponse.deserializeBinary(arr) //反序列化
         console.log(tmp)
         console.log(tmp.getCode())
         console.log(tmp.getMsg())
         console.log(tmp.getUserinfo())
    }).catch((error) => {
         console.log(error)
    })
    

3、测试传输效果

  1. 服务端收到请求
    在这里插入图片描述
  2. 客户端收到的响应
    在这里插入图片描述
回答: Protobuf是一种数据序列化格式,它可以将结构化数据转换为进制格式,以便在网络传输或存储时使用。在Spring Boot中,可以通过集成Protobuf来实现与Protobuf数据的交互。首先,你需要下载Protobuf的安装包,可以在官方网站\[2\]上找到下载地址。下载完成后,解压安装包即可。接下来,在Spring Boot项目中配置Protobuf的序列化器。你可以创建一个名为CommonConfig的配置类,并在其中定义一个ProtobufHttpMessageConverter的Bean,用于处理Protobuf数据的转换\[3\]。这样,你就可以在Spring Boot中使用Protobuf进行数据的传输和处理了。 #### 引用[.reference_title] - *1* *2* [springboot simple (10) springboot protobuf](https://blog.youkuaiyun.com/afei8080/article/details/128297408)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down28v1,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [ProtoBuf整合SpringBoot](https://blog.youkuaiyun.com/yangzhe19931117/article/details/130177306)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down28v1,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值