

重新編寫proto文件
syntax = "proto3";
package services;
import "google/api/annotations.proto";
message ProdRequest {
int32 prod_id = 1; //傳入id
}
message ProdResponse {
int32 prod_stock = 1; //商品庫存
}
message QuerySize {
int32 size = 1; //頁尺寸,這里的1並不是默認值,而是字段的順序,如果有其他參數就就寫2
}
message ProdResponseList {
repeated ProdResponse prodres = 1; //返回了一堆商品庫存,使用了repeated修飾符,還是用了結構體的引用,引用了ProdResponse結構體
}
service ProdService {
rpc GetProdStock (ProdRequest) returns (ProdResponse) {
option (google.api.http) = {
get: "/v1/prod/{prod_id}" //和request中的prod_id對應,不能寫錯
};
}
rpc GetProdStocks (QuerySize) returns (ProdResponseList);
}
protoc --grpc-gateway_out=logtostderr=true:../services Prod.proto重新生成代碼
新定義的GetProdStocks返回值是這樣的
因為除了Prodres字段其他的字段json都不解析,我只要構造一個Prodres字段就可以了,這里是一個數組

客戶端調用代碼
package main
import (
"context"
"fmt"
"google.golang.org/grpc"
"grpccli/helper"
"grpccli/services"
"log"
)
func main() {
//creds, err := credentials.NewClientTLSFromFile("keys/server.crt", "localhost")
//if err != nil {
// log.Fatal(err)+
//}
creds := helper.GetClientCreds()
conn, err := grpc.Dial(":8081", grpc.WithTransportCredentials(creds))
if err != nil {
log.Fatal(err)
}
defer conn.Close()
prodClient := services.NewProdServiceClient(conn)
/*
proto文件內容
message QuerySize {
int32 size = 1; //頁尺寸,這里的1並不是默認值,而是字段的順序,如果有其他參數就就寫2
}
message ProdResponseList {
repeated ProdResponse prodres = 1; //返回了一堆商品庫存,使用了repeated修飾符
}
service ProdService {
rpc GetProdStock (ProdRequest) returns (ProdResponse) {
option (google.api.http) = {
get: "/v1/prod/{prod_id}" //和request中的prod_id對應,不能寫錯
};
}
rpc GetProdStocks (QuerySize) returns (ProdResponseList); //定義了參數是QuerySize
}
*/
response, err := prodClient.GetProdStocks(context.Background(), &services.QuerySize{Size: 10}) //這里傳入的QuerySize是在proto中定義好的參數
if err != nil {
log.Fatal(err)
}
fmt.Println(response.Prodres)
}