語法速學,返回數組 repeated修飾符


重新編寫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)
}





免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM