2

更方便的在微信公众号阅读文章可以关注公众号:海生的go花园
image.png

在上一节文章里 go微服务框架Kratos(连载一):入门教程(安装以及跑通示例)我们学会了 安装kratos。

本章节,我们学习如何定义一个 api接口并且实现。

一、运行样例

我们先启动一个kratos样例的http服务
在上节创建的helloworld项目目录执行

go run ./cmd/helloworld  -conf  configs/config.yaml

image.png
可以启动http服务。
我们打开 浏览器输入

http://localhost:8000/helloworld/1

会返回
image.png
可以发现样例运行成功了。

二、样例api接口阅读

我们打开使用kratos建立的样例项目helloworld,
在 greeter.proto文件里有 下面一个路由

get: "/helloworld/{name}"

image.png

2.1 修改样例,新增一个 get 请求

2.1.1 我们打开 greeter.proto文件,对照 SayHello增加一个接口SayHi如下:

// Sends a hi
  rpc SayHi (HelloRequest) returns (HelloReply) {
    option (google.api.http) = {
      get: "/hi/{name}"
    };
  }

写好后如下:
image.png

2.1.2 执行make api,生产api接口

➜ make api

输出:

protoc --proto_path=./api \
               --proto_path=./third_party \
               --go_out=paths=source_relative:./api \
               --go-http_out=paths=source_relative:./api \
               --go-grpc_out=paths=source_relative:./api \
               --openapi_out=fq_schema_naming=true,default_response=false:. \
               api/helloworld/v1/error_reason.proto api/helloworld/v1/greeter.proto

如果执行make api 报错,比如提示,未安装 protoc-gen-go: program not found or is not executable,可以在 make api 执行之前,先执行一下 make init 安装一下kratos需要的依赖和插件。
此时我们可以看 greeter_http.pb.go 里面的代码,增加SayHi()如下:
image.png

2.1.3 实现api接口SayHi()

我们查看 SayHello()接口的实现,发现在 internal/service/greeter.go
image.png
那我们实现SayHi()也同样在这样文件中。
我们在 SayHello()方法下,写入如下代码:

// SayHi implements helloworld.GreeterServer.
func (s *GreeterService) SayHi(ctx context.Context, in *v1.HelloRequest) (*v1.HelloReply, error) {
    g, err := s.uc.CreateGreeter(ctx, &biz.Greeter{Hello: in.Name})
    if err != nil {
        return nil, err
    }
    return &v1.HelloReply{Message: "hi " + g.Hello}, nil
}

此时显示如下:
image.png

2.1.4 在浏览器中访问接口 http://localhost:8000/hi/1

我们重新编译一下,

go run ./cmd/helloworld  -conf  configs/config.yaml

然后在浏览器中输入:http://localhost:8000/hi/1 展示如下:
image.png
我们第一个get接口写成功了。

2.2 修改样例,新增一个 post 请求

2.2.1 新增一个 Say() proto定义,如下:

  // Say a hi
  rpc Say (HelloRequest) returns (HelloReply) {
    option (google.api.http) = {
      post: "/say",
      body: "*",
    };
  }

我们这里主要有两点修改

  1. post方法,以及api的url
  2. 定义接受的body为 "*"

2.2.2 执行make api,生成api接口

➜ make api

我们会发现greeter_http.pb.go文件中GreeterHTTPServer中多了一个 Say()

type GreeterHTTPServer interface {
    Say(context.Context, *HelloRequest) (*HelloReply, error)
    SayHello(context.Context, *HelloRequest) (*HelloReply, error)
    SayHi(context.Context, *HelloRequest) (*HelloReply, error)
}

2.2.3 在service中实现api接口Say()

在internal/service/greeter.go中实现 Say()方法,代码如下:

// Say implements helloworld.GreeterServer.
func (s *GreeterService) Say(ctx context.Context, in *v1.HelloRequest) (*v1.HelloReply, error) {
    g, err := s.uc.CreateGreeter(ctx, &biz.Greeter{Hello: in.Name})
    if err != nil {
        return nil, err
    }
    return &v1.HelloReply{Message: "say " + g.Hello}, nil
}

2.2.4 请求post接口

此时我们重启一下一下服务

go run ./cmd/helloworld  -conf  configs/config.yaml

然后模拟请求一下,成功了。
image.png

更方便的在微信公众号阅读文章可以关注公众号:海生的go花园
image.png


海生
104 声望32 粉丝

与黑夜里,追求那一抹萤火。