最近项目需要,使用golang+protobuf+aes cbc 对数据请求格式和数据进行加密
前篇文章已经对数据加密做了说明。
AES数据加密
本篇主要讲述如何使用protobuf 进行数据传输
protobuf的说明在这里就不阐述了
直接开始了
新建一个proto文件
#进入到项目下
$ cd test && mkdir tutorials && cd tutorials && touch User.proto
#编辑
$ vi User.proto
syntax = "proto3";
package tutorials;
message LoginRequest{
string username = 1;
string password = 2;
string platform = 3;
}
message LoginResponse{
int32 code = 1;
string msg = 2;
}
编译成go文件
protoc -I=./tutorials/ --go_out=./tutorials/ ./tutorials/User.proto
#出现以下问题,就先安装protoc-gen-go 到GOPATH下
protoc-gen-go: program not found or is not executable
Please specify a program using absolute path or make sure the program is available in your PATH system variable
--go_out: protoc-gen-go: Plugin failed with status code 1.
$ go get -u github.com/golang/protobuf/protoc-gen-go
使用
package main
import "test/utils"
import "log"
import "test/tutorials"
//记得引入此库
import "github.com/golang/protobuf/proto"
func main(){
login := tutorials.LoginRequest{}
login.Username = "zhangsan"
login.Password = "12345678"
login.Platform = "platform"
log.Println(login)
//将login变成字节数组
out,err := proto.Marshal(&login)
if err != nil {
log.Fatal(err.Error())
}
//加密(请参考上篇写的AES加密)
encrypted ,err2 := utils.Encrypt(out)
log.Println(err2)
log.Println(encrypted)
//解密(请参考上篇写的AES解密)
decrypted, err3 := utils.Decrypt(encrypted)
log.Println(decrypted)
log.Println(err3)
}
请求服务
#请求工具类编写
package utils
import (
"io/ioutil"
"log"
"net/http"
"strings"
"test/config"
)
func Request( text,url string) (string,error){
//请求客户端
client := &http.Client{}
req, e := http.NewRequest("POST", config.BASE_URL+url, strings.NewReader(text))
if e != nil {
log.Fatalln(e.Error())
}
req.Header.Set("Content-Type", "application/x-protobuf")
req.Header.Set("TRADING_CHAIN_PLATFORM", config.REQ_PLATFORM)
response, er := client.Do(req)
if er !=nil {
log.Fatalln(er.Error())
}
body, err := ioutil.ReadAll(response.Body)
if err != nil {
log.Fatalln(err)
}
return string(body),nil
}
测试
vi main.go
#追加
s, err := utils.Request(encrypted, "/user/validate-password")
if err != nil {
log.Fatalln(err.Error())
}
//解密
decrypted, err3 := utils.Decrypt(s)
log.Println(decrypted)
log.Println(err3)
//使用proto对象解析
loginResponse := &tutorials.Response{}
decryptIntoProto := []byte(decrypted)
proto.Unmarshal(decryptIntoProto, loginResponse)
log.Println(loginResponse)
好了,可以进行测试了。
源代码
有疑问加站长微信联系(非本文作者)