• 语法速学,返回数组 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)
    }
    




  • 相关阅读:
    Javascript(js)分页程序
    Erlang gb_trees
    ASP.NET MVC 扩展之 JsonpResult ,用来提供轻量级跨域调用服务
    facebook folly编译脚本
    开源项目 XDD
    ObjectiveC——消息、Category和Protocol
    Lua编译执行与错误
    ASP.NET MVC 4 RC的JS/CSS打包压缩功能
    web插件化
    精益企业应用平台
  • 原文地址:https://www.cnblogs.com/hualou/p/12070280.html
Copyright © 2020-2023  润新知