go-zero创建RESTful API 服务的方法

 更新时间:2024年11月12日 09:27:01   作者:Aliancnly  
文章介绍了如何使用go-zero框架和goctl工具快速创建RESTfulAPI服务,通过定义.api文件并使用goctl命令,可以自动生成项目结构、路由、请求和响应模型以及处理逻辑,感兴趣的朋友一起看看吧

在 go-zero 中,创建 RESTful API 服务可以通过 goctl 命令快速完成。go-zero 提供了一种高效的方式来生成服务的项目结构、路由、请求和响应模型、以及处理逻辑。这些都是通过定义 .api 文件,并用 goctl 工具生成代码完成的。下面是创建 RESTful API 服务的步骤:

1. 安装 go-zero 和 goctl

确保已经安装了 go-zero 框架及其代码生成工具 goctl

go install github.com/zeromicro/go-zero/tools/goctl@latest

2. 创建一个新的 API 服务项目

使用 goctl api new 命令可以快速生成一个 RESTful API 项目的目录结构。例如,创建一个名为 user 的服务:

goctl api new user

这会生成如下的目录结构:

user/
├── etc/                   # 配置文件
│   └── user-api.yaml      # API 服务配置
├── user.api               # API 定义文件
├── go.mod                 # Go 模块文件
├── internal/
│   ├── config/            # 配置文件的结构体定义
│   │   └── config.go
│   ├── handler/           # HTTP 路由处理器
│   │   ├── createuserhandler.go
│   │   └── routes.go      # 路由定义文件
│   ├── logic/             # 业务逻辑
│   │   └── createuserlogic.go
│   ├── svc/               # 服务上下文
│   │   └── servicecontext.go
│   └── types/             # 请求和响应数据结构
│       └── types.go
└── main.go                # 主程序入口

3. 定义 .api 文件

在 go-zero 中,.api 文件用于定义 RESTful API 的接口、请求参数、响应格式等信息。打开 user.api 文件,编辑如下内容:

syntax = "v1";
info(
    title: "User API"
    desc: "User service API"
    version: "1.0"
)
type (
    UserRequest {
        name string
        age  int
    }
    UserResponse {
        id   int
        name string
        age  int
    }
)
service user {
    @handler CreateUser
    post /api/v1/user (UserRequest) returns (UserResponse)
}

在这个 .api 文件中:

UserRequestUserResponse 定义了请求和响应的数据结构。service user 定义了服务的名称。@handler CreateUser 表示 CreateUser 处理器会处理 POST /api/v1/user 路由。

4. 使用 goctl 生成代码

在项目根目录下,使用 goctl 生成代码:

goctl api go -api user.api -dir .

执行后,goctl 会生成以下代码:

  • handler:包含路由的处理器文件。
  • logic:包含业务逻辑文件。
  • types:包含请求和响应的类型文件。

具体地,会生成 internal/handler/createuserhandler.gointernal/logic/createuserlogic.go 文件。

5. 实现业务逻辑

打开 internal/logic/createuserlogic.go 文件,实现业务逻辑。示例如下:

package logic
import (
    "context"
    "project-name/internal/svc"
    "project-name/internal/types"
    "github.com/zeromicro/go-zero/core/logx"
)
type CreateUserLogic struct {
    logx.Logger
    ctx    context.Context
    svcCtx *svc.ServiceContext
}
func NewCreateUserLogic(ctx context.Context, svcCtx *svc.ServiceContext) *CreateUserLogic {
    return &CreateUserLogic{
        Logger: logx.WithContext(ctx),
        ctx:    ctx,
        svcCtx: svcCtx,
    }
}
func (l *CreateUserLogic) CreateUser(req *types.UserRequest) (resp *types.UserResponse, err error) {
    // 假设逻辑是简单地返回请求的内容,并附加一个 id
    resp = &types.UserResponse{
        id:   1,
        name: req.Name,
        age:  req.Age,
    }
    return resp, nil
}

在这个例子中,CreateUserLogic 是业务逻辑处理器,用于处理 UserRequest 请求,并返回 UserResponse

6. 配置路由

internal/handler/routes.go 文件中,goctl 已经生成了路由注册代码。确保路由已正确配置:

package handler
import (
    "net/http"
    "github.com/zeromicro/go-zero/rest/httpx"
    "project-name/internal/logic"
    "project-name/internal/svc"
    "project-name/internal/types"
)
func RegisterHandlers(svcCtx *svc.ServiceContext) {
    http.HandleFunc("/api/v1/user", func(w http.ResponseWriter, r *http.Request) {
        var req types.UserRequest
        if err := httpx.Parse(r, &req); err != nil {
            httpx.Error(w, err)
            return
        }
        l := logic.NewCreateUserLogic(r.Context(), svcCtx)
        resp, err := l.CreateUser(&req)
        if err != nil {
            httpx.Error(w, err)
        } else {
            httpx.OkJson(w, resp)
        }
    })
}

7. 配置服务并启动

打开 etc/user-api.yaml 文件,配置 RESTful 服务的端口等信息:

Name: user-api
Host: 0.0.0.0
Port: 8080

然后,在 main.go 文件中启动服务:

package main
import (
    "flag"
    "fmt"
    "project-name/internal/config"
    "project-name/internal/handler"
    "project-name/internal/svc"
    "github.com/zeromicro/go-zero/core/conf"
    "github.com/zeromicro/go-zero/rest"
)
var configFile = flag.String("f", "etc/user-api.yaml", "the config file")
func main() {
    flag.Parse()
    var c config.Config
    conf.MustLoad(*configFile, &c)
    server := rest.MustNewServer(c.RestConf)
    defer server.Stop()
    ctx := svc.NewServiceContext(c)
    handler.RegisterHandlers(ctx)
    fmt.Printf("Starting server at %s:%d...\n", c.Host, c.Port)
    server.Start()
}

8. 启动服务并测试

在项目根目录下运行服务:

go run main.go -f etc/user-api.yaml

服务启动后,可以使用 curl 命令测试:

curl -X POST -d '{"name":"Alice","age":25}' http://localhost:8080/api/v1/user

返回结果应类似于:

{
    "id": 1,
    "name": "Alice",
    "age": 25
}

总结

  • 定义 .api 文件:定义 API 接口、数据结构、请求和响应。
  • 使用 goctl 生成代码:使用 goctl api go 命令生成路由、处理器和业务逻辑文件。
  • 实现业务逻辑:在生成的逻辑文件中实现业务逻辑。
  • 启动服务并测试:启动服务并通过 HTTP 请求进行测试。

通过 go-zero 的 goctl 工具,可以快速创建 RESTful API 服务,大大提高了开发效率。

到此这篇关于go-zero创建RESTful API 服务的方法的文章就介绍到这了,更多相关go-zero RESTful API 服务内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Go语言中的数据格式(json、xml 、msgpack、protobuf)使用总结

    Go语言中的数据格式(json、xml 、msgpack、protobuf)使用总结

    在分布式的系统中,因为涉及到数据的传输,所以一定会进行数据的交换,此时就要定义数据交换的格式,例如二进制、Json、Xml等等。本文总结了Go语言中的数据格式,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-07-07
  • golang时间/时间戳的获取与转换实例代码

    golang时间/时间戳的获取与转换实例代码

    说实话,golang的时间转化还是很麻烦的,最起码比php麻烦很多,下面这篇文章主要给大家介绍了关于golang时间/时间戳的获取与转换的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2022-11-11
  • vscode搭建go开发环境案例详解

    vscode搭建go开发环境案例详解

    对于Visual Studio Code开发工具,有一款优秀的GoLang插件,今天通过本文给大家介绍下vscode搭建go开发环境的详细教程,感兴趣的朋友跟随小编一起看看吧
    2021-12-12
  • 详解Go语言中数组,切片和映射的使用

    详解Go语言中数组,切片和映射的使用

    Arrays (数组), Slices (切片) 和 Maps (映射) 是常见的一类数据结构。这篇文章将为大家详细介绍一下Go语言中数组,切片和映射的使用,感兴趣的可以学习一下
    2022-07-07
  • Go defer 去掉闭包函数及用法分析

    Go defer 去掉闭包函数及用法分析

    这篇文章主要为大家介绍了Go defer 去掉闭包函数及用法分析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-07-07
  • golang中使用匿名结构体的方法

    golang中使用匿名结构体的方法

    这篇文章主要介绍了golang中使用匿名结构体,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-08-08
  • Go语言的反射reflect使用大全

    Go语言的反射reflect使用大全

    Go语言中reflect包提供了运行时反射的功能,本文主要介绍了Go语言的反射reflect使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2024-08-08
  • Golang信号处理及如何实现进程的优雅退出详解

    Golang信号处理及如何实现进程的优雅退出详解

    这篇文章主要给大家介绍了关于Golang信号处理及如何实现进程的优雅退出的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧。
    2018-03-03
  • Go语言实战之实现一个简单分布式系统

    Go语言实战之实现一个简单分布式系统

    如今很多云原生系统、分布式系统,例如 Kubernetes,都是用 Go 语言写的,这是因为 Go 语言天然支持异步编程。本篇文章将介绍如何用 Go 语言编写一个简单的分布式系统,需要的小伙伴开业跟随小编一起学习一下
    2022-10-10
  • Go Java算法之累加数示例详解

    Go Java算法之累加数示例详解

    这篇文章主要为大家介绍了Go Java算法之累加数示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-08-08

最新评论