zoukankan      html  css  js  c++  java
  • 语法速学,返回数组 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)
    }
    




  • 相关阅读:
    学习4412开发板gdb和gdbserver的调试
    S5P4418开发板android源码下uboot和内核缺省文件的配置
    IMX6开发板Qtopia2.2.0开发环境搭建以及编译镜像
    IMX6Q开发板LinuxQT挂载U盘及TF卡
    没有更好的,五种操作系统助力研发,IMX6开发板做得到
    iTOPiMX6UL开发板MiniLinuxCAN测试使用文档
    Exynos4412开发板网络同一网段
    分享几个4412开发板新录制的视频,不是VIP也能看
    itop4412开发版安卓系统卸载默认apk使用文档
    一个总经理的11个经典面试问题
  • 原文地址:https://www.cnblogs.com/hualou/p/12070280.html
Copyright © 2011-2022 走看看