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




原文地址:https://www.cnblogs.com/hualou/p/12102985.html