Protubuf 数据传输详解
Content-Type 首部
MIME-TYPE
multipurpose internet mail extension 多用途互联网邮件扩展类型。是设定某种扩展名的文件用一种应用程序来打开的方式类型,当该扩展名文件被访问的时候,浏览器会自动使用指定应用程序来打开。Http报文中,Content-type
首部就是用来说明实体主体的MIME
类型,它的值就是标准化的MIME-TYPE
。对于spring-boot,当你在controller中使用@RequestBody
时,相当于默认了Content-type: application/json
,当然你也可以按照字符串来读取body中的内容。
从客户端向服务端 POST 数据
我们以 Spring-Boot 为服务器端开发框架,接收由客户端发送的二进制流数据时,可以100%利用protobuf的压缩特性,高效的进行数据传输,如果把编译后的二进制流嵌入JSON中传输,那就失去了protobuf进行数据序列化的意义。下面我们通过 Spring-Boot,编写一个 Controller, 模拟网关对于各种 content-type
的处理,来理解 Protobuf 的神奇之处。
定义protobuf文件
syntax = "proto3";
message Result{
string id = 1;
string title = 2;
string content = 3;
}
服务器端代码
在Spring-Boot的服务器端,我们既可以使用inputStream来接收包含protobuf的post请求,也可以直接按string来接收请求。实际上,客户端都是将数据按照protobuf规则编译成为byte-array,所以客户端在http header 中添加的content-type
并不会对后台的数据处理造成影响。
import com.cso.localhazrd.demo.domain.Message;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind