zoukankan      html  css  js  c++  java
  • 9.调用http api的姿势:带参数调用

    定义proto文件

    syntax = "proto3";
    package Models;
    
    message ProdModel {  //定义一个结构体,因为这里返回值是一个切片,作为返回值的元素,要和server中定义的返回值中的元素的字段是一样的
        int32 ProdID = 1;
        string ProdName = 2;
    }
    
    message ProdRequest { //定义一个请求结构体,接受请求的参数
        int32 size = 1;
    }
    
    message ProdListResponse {
        repeated ProdModel data = 1; //这里表示这个数据结构是一个切片,存放的是ProdModel结构体,data是因为api返回值得json中的key是data,所以这里也要一致
    }

    grpc框架规定好了我们调用api的方式,也就解决了上节课的问题

    package main
    
    import (
        "context"
        "fmt"
        "github.com/micro/go-micro/client"
        "github.com/micro/go-micro/client/selector"
        "github.com/micro/go-micro/registry"
        myhttp "github.com/micro/go-plugins/client/http"
        "github.com/micro/go-plugins/registry/consul"
        "go-micro/Models"
        "log"
    )
    
    func callAPI(s selector.Selector) {
        myCli := myhttp.NewClient(
            client.Selector(s),
            client.ContentType("application/json"),
        )
        req := myCli.NewRequest("prodservice", "/v1/prods", Models.ProdRequest{Size: 2}) //使用生成的pb文件中的结构体作为参数封装到请求体中
    
        var resp Models.ProdListResponse //这里使用生成的response对象,客户端只需要传入这个就可以了,无需关心服务端返回什么格式,因为服务端已经用rpc框架定义好了这一切,我们使用即可
        err := myCli.Call(context.Background(), req, &resp)
        if err != nil {
            log.Fatal(err)
        }
        fmt.Println(resp)
    }
    
    func main() {
        consulReg := consul.NewRegistry(
            registry.Addrs("localhost:8500"),
        )
        mySelector := selector.NewSelector(
            selector.Registry(consulReg),
            selector.SetStrategy(selector.RoundRobin), //设置查询策略,这里是轮询
        )
        callAPI(mySelector)
    }
    




  • 相关阅读:
    2017年校招全国统一模拟笔试 01翻转
    第二周总结
    数组的最大子数组求和问题
    第一周总结
    HTML与CSS学习
    关于家庭小账本软件的设计一
    从小工到专家读后感
    从小工到专家读后感
    从小工到专家读后感
    动手动脑
  • 原文地址:https://www.cnblogs.com/hualou/p/12102985.html
Copyright © 2011-2022 走看看