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)
    }
    




  • 相关阅读:
    C#关于日期 月 天数 和一年有多少周及根据某年某周获取时间段的计算
    配置tomcat
    C# 动态编译及反射执行
    数据库日志自增量太大导致超时
    validateRequest验证引发错误“检测到有潜在危险的 Request.Form 值”
    入手了DELL Ultrabook,还不错哦!
    Spring.NET学习笔记1——控制反转(基础篇)
    Win7 64位下Kindle4、闪迪Cruzer BladeU盘等无法安装驱动问题的解决方法
    转:CentOS 5.5下LVM分区在线扩容
    [转]关于64位Sublime Text 2破解注册码的方法
  • 原文地址:https://www.cnblogs.com/hualou/p/12070280.html
Copyright © 2011-2022 走看看