go-zero(二) api语法和goctl应用

go-zero api语法和goctl应用

在实际开发中,我们更倾向于使用 goctl 来快速生成代码。 goctl 可以根据 api快速生成代码模板,包括模型、逻辑、处理器、路由等,大幅提高开发效率。

一、构建api demo

现在我们通过 goctl 创建一个最小化的 HTTP 服务来了解 goctl 的 go-zero api 服务的概况,

创建一个项目目录,然后再这个目录下执行命令:

goctl api new user

goctl apigoctl 中的核心模块之一,可以通过 api 文件一键快速生成一个 go-zero项目。new参数不需要 API 文件便能生成 Go HTTP 服务,user 是服务名称,可以自定义。

1. 项目结构说明

命令执行成功后,会在当前目录下生成一个 user目录,目录包含一些文件:

├── user.api
├── user.go
├── etc
│   └── user-api.yaml
├── go.mod
└── internal
    ├── config
    │   └── config.go
    ├── handler
    │   ├── demohandler.go
    │   └── routes.go
    ├── logic
    │   └── demologic.go
    ├── svc
    │   └── servicecontext.go
    └── types
        └── types.go

goctl 生成的是一个典型的 go-zero 项目结构,每个文件和目录都有其特定的功能。下面介绍下每个文件的功能。

xxx.api
这个文件是 go-zero 的 API 定义文件,用于描述服务的接口、请求和响应结构。在这个文件中,可以定义:

  • 请求体的结构(如需要的字段)。
  • 响应体的结构(返回给客户端的数据)。
  • 服务的路由和处理器(可以使用 HTTP 方法和路径)。

xxx.go(一般是用api的文件名,例如user.go)
这个文件的主要作用是将 API 的定义和实际的业务代码连接起来,main函数的入口。

user-api.yaml
里面储存了一些运行服务时需要的配置信息,包括:

  • 服务名、地址、端口
  • 数据库连接字符串
  • redis 、etcd服务配置
  • 开发模式、日志输出等级等等

config.go
负责读取 user-api.yaml 配置文件并将其解析为 Go 语言中的结构体。

routes.go
负责定义 HTTP 路由,将请求的 URL 路径与处理请求的具体函数(handler)绑定。

  • 初始化路由:设置 HTTP 方法和路径,并将其与具体的处理函数关联。
  • 中间件应用:在路由定义中,可以将中间件与特定的路由关联。

xxxhandler.go
主要用来处理返回信息

  • 请求处理函数:具体实现 API 请求的逻辑,如接收请求、调用业务逻辑层、构建响应等。
  • 错误处理:处理业务逻辑中的错误并返回合适的响应。

logic/xxxlogic.go
该文件封装了相关的业务逻辑。

  • 主要业务逻辑:实现具体的用户操作,如添加用户、获取用户信息等。
  • 与数据层交互:调用数据层的方法以访问数据库。

servicecontext.go
用来调用config.go中配置信息,并把他们注册倒服务中,相当于服务的基本环境,例如数据库连接、缓存客户端等。可以在不同的请求处理之间传递,以便在整个应用中保持一致性。

  • 字段定义:定义应用所需的实例,例如 DB、Cache、Logger、配置等。
  • 构造函数:初始化服务上下文的构造函数,将所需资源注入上下文。

types/types.go
通常用于定义与业务逻辑或数据层交互的数据结构。

  • 数据结构:定义与用户、订单、商品等业务相关的结构体。
  • 序列化:可以包含用于 JSON 序列化和反序列化的结构体。

2. api语法介绍和分析

我们在实现业务逻辑之前,先来看下user.api文件,因为我们都项目代码是基于user.api自动生成的。

我这边不会系统的介绍api语法,用到什么我讲什么,如果需要具体了解更多的api语法可以看官方文档:

https://go-zero.dev/docs/tasks/dsl/api

syntax = "v1"  //指定了使用的语法版本为 "v1"。这个是固定写法

//Request 请求类型 ,包含一个字段 Name
type Request {
	//options=you|me:表示该字段只能接受 "you" 或 "me" 这两个值,以确保输入的有效性
	Name string `path:"name,options=you|me"`
	
}
//定义了名为 Response 的响应类型,包含一个字段 Message,该字段将在返回的 JSON 响应中被使用。
type Response {
	Message string `json:"message"`
}

service user-api {
	//指明处理该 API 请求的处理函数是 UserHandler
	@handler UserHandler
	//定义一个 GET 请求路由,当访问路径为 /from/:name
	//(Request) returns (Response)代表这个api需要请求参数,并且返回一个响应参数
	get /from/:name (Request) returns (Response)
}

3. 实现api demo

这个api demo功能很简单,就是当用户当用户访问 /from/:name 这个路径时,返回一个自定义消息,这里我们就值返回传入的name

下面我们打开internal/logic/userlogic.go文件, 找到NewUserLogic方法,把代码修改为:

	// todo: add your logic here and delete this line
	// return //注释掉原来的return 
	return &types.Response{
		Message: req.Name,  //返回从requset接受过来的name
	}, nil

使用postman或者 curl ,执行 127.0.0.1:8888/from/you 或者127.0.0.1:8888/from/me,运行效果如下:

在这里插入图片描述

注意:如果运行时出现 error: config file user/etc/user-api.yaml ,找不到配置文件,在user.go中,把配置文件路径重新设置下。

4. 修改api

之前的项目,name只能传入you或者me ,如果我们想要实现传入任意字符,怎么实现?

type Request struct {
    //Name string `path:"name,options=you|me"` 
    Name string `path:"name"`  //删除options选项
}

type Response struct {
    Message string `json:"message"`
}

只需要在types.go文件中把,options=you|me 这段删除即可。但考虑到这个文件是goctl自动生成的,如果修改了,使用goctl重新生成代码时会自动覆盖。

我们可以在 user.api 文件中,删除 options=you|me 的部分。然后,您可以根据 user.api 文件使用goctl重新生成新的代码:

goctl api go --api user.api --dir ./

goctl api go 是根据 api 文件生成 Go HTTP 代码。

  • --api 后面是 api文件
  • --dir 后面是代码生成的目录

执行之后,go-zero的设计思想就是专心的业务逻辑实现,可以看到goctl 自动帮我们忽略了下面这些已经存在的文件,也就说其他文件都自动覆盖了。

etc/user-api.yaml exists, ignored generation
internal/config/config.go exists, ignored generation
user.go exists, ignored generation
internal/svc/servicecontext.go exists, ignored generation
internal/handler/userhandler.go exists, ignored generation
internal/logic/userlogic.go exists, ignored generation
Done.

我们可以再去看下types.go文件,name字段已经没有选项了。

5. 启动服务

这时候我们就可以输入任意字符串了

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/920258.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Windows Server 2022 Web1

载入靶机,看到相关描述: 进入虚拟机发现桌面有phpstudy和解题两个软件: 打开解题.exe,发现里面是一些问题,接下来就需要获取相关信息: 1、shell密码 2、IP地址 3、隐藏账户名称 4、挖矿程序的矿池域名 打…

经典的网络安全技术

以我的理解,“黑客”大体上应该分为“正”、“邪”两类,正派黑客依靠自己掌握的知识帮助系统管理员找出系统中的漏洞并加以完善,而邪派黑客则是通过各种黑客技能对系统进行攻击、入侵或者做其他一些有害于网络的事情,因为邪派黑客…

【TDOA最小二乘解算】两步最小二乘迭代的TDOA解算方法,适用于二维平面、自适应锚点(附MATLAB代码)

本文所述的MATLAB代码实现了一个基于两步加权最小二乘法的二维目标定位算法,利用多个锚点(基站)和时间差到达(TDOA)数据来估计未知目标的位置。 文章目录 运行结果代码代码功能概述代码结构和详细说明初始化部分参数和…

VideoCrafter模型部署教程

一、介绍 VideoCrafter是一个功能强大的AI视频编辑和生成工具,它结合了深度学习和机器学习技术,为用户提供了便捷的视频制作和编辑体验。 系统:Ubuntu22.04系统,显卡:4090,显存:24G 二、基础…

【图像压缩感知】论文阅读:Content-Aware Scalable Deep Compressed Sensing

tips: 本文为个人阅读论文的笔记,仅作为学习记录所用。本文参考另一篇论文阅读笔记 Title: Content-Aware Scalable Deep Compressed Sensing Journal: TIP 2022 代码链接: https://github.com/Guaishou74851/CASNet…

AMD(Xilinx) FPGA配置Flash大小选择

目录 1 FPGA配置Flash大小的决定因素2 为什么选择的Flash容量大小为最小保证能够完成整个FPGA的配置呢? 1 FPGA配置Flash大小的决定因素 在进行FPGA硬件设计时,选择合适的配置Flash是我们进行硬件设计必须考虑的,那么配置Flash大小的选择由什…

统⼀数据返回格式快速⼊⻔

为什么会有统⼀数据返回? 其实统一数据返回是运用了AOP(对某一类事情的集中处理)的思维。 优点: 1.⽅便前端程序员更好的接收和解析后端数据接⼝返回的数据。 2.降低前端程序员和后端程序员的沟通成本,因为所有接⼝都…

window 中安装 php 环境

window 中安装 php 环境 一、准备二、下载三、安装四、测试 一、准备 安装前需要安装 Apache ,可以查看这篇博客。 二、下载 先到这里下载 这里选择版本为“VS16 x64 Thread Safe”,这个版本不要选择线程安全的,我试过,会缺少文…

HarmonyOS Next 关于页面渲染的性能优化方案

HarmonyOS Next 关于页面渲染的性能优化方案 HarmonyOS Next 应用开发中,用户的使用体验至关重要。其中用户启动APP到呈现页面主要包含三个步骤: 框架初始化页面加载布局渲染 从页面加载到布局渲染中,主要包含了6个环节: 执行页…

【Linux网络编程】简单的UDP套接字

目录 一,socket编程的相关说明 1-1,sockaddr结构体 1-2,Socket API 二,基于Udp协议的简单通信 三,UDP套接字的应用 3-1,实现英译汉字典 一,socket编程的相关说明 Socket编程是一种网络通信…

【WPF】Prism学习(十)

Prism MVVM 1.BindableBase 1.1. BindableBase的作用: Prism库提供了一个基础类BindableBase,这个类实现了INotifyPropertyChanged接口。这个接口允许ViewModel(视图模型)通知视图(View)当属性&#xff0…

计算机网络学习笔记-3.3以太网和局域网

以太网 以太网(Ethernet)是一种用于计算机网络的技术规范,广泛应用于局域网(LAN)的构建。它定义了如何在网络设备之间传输数据,并确保这些数据能够被可靠传送。以太网是目前最常见和最广泛使用的局域网技术…

聊一聊Elasticsearch的索引分片的恢复机制

1、什么是索引分片的恢复? 所谓索引分片的恢复指的是在某些条件下,索引分片丢失,ES会把某索引的分片复制一份来得到该分片副本的过程。 2、触发分片恢复的场景有哪些? 分片的分配 当集群中节点的数量发生变化,或者配…

LLaMA-Factory 上手即用教程

LLaMA-Factory 是一个高效的大型语言模型微调工具,支持多种模型和训练方法,包括预训练、监督微调、强化学习等,同时提供量化技术和实验监控,旨在提高训练速度和模型性能。 官方开源地址:https://github.com/hiyouga/L…

NVR接入录像回放平台EasyCVR视频融合平台加油站监控应用场景与实际功能

在现代社会中,加油站作为重要的能源供应点,面临着安全监管与风险管理的双重挑战。为应对这些问题,安防监控平台EasyCVR推出了一套全面的加油站监控方案。该方案结合了智能分析网关V4的先进识别技术和EasyCVR视频监控平台的强大监控功能&#…

信息与网络安全

1.对称密码体制的优缺点 优点:1.加密解密处理速度快 2.保密度高; 缺点:1.对称密码算法的密钥 分发过程复杂,所花代价高 2.多人通信时密钥组合的数量会出现爆炸性膨胀(所需密钥量大) 3.通信双方必须统一密钥…

NAT网络地址转换——Easy IP

NAT网络地址转换 Tip: EasylP没有地址池的概念,使用接口地址作为NAT转换的公有地址。EasylP适用于不具备固定公网IP地址的场景:如通过DHCP, PPPOE拨号获取地址的私有网络出口,可以直接使用获取到的动态地址进行转换。 本次实验模拟nat协议配置 AR1配置如下&…

【Three.js基础学习】27.Modified materials

前言 补充:\node_modules\three\src\renderers\shaders 自Three.js第132版以来,位于ShaderLib/文件夹中的着色器现在按材质分组。 顶点代码和片段代码都在同一个文件中。 课程 学习如何改进3DS内置材质 改进网格标准材质 两种方法 1.使用Three.js钩子&am…

使用 AI 在医疗影像分析中的应用探索

文章目录 摘要引言医疗影像分析中的 AI 应用场景AI 技术在医疗影像中的核心算法成功案例解析实现医疗影像分类的关键技术点代码示例及解析1. 数据加载与预处理2. 模型定义3. 模型训练4. 主函数完整代码 QA 环节总结参考资料 摘要 医疗影像分析是 AI 在医疗领域的重要应用方向&…

全面认识AI Agent,一文读懂AI智能体的架构指南

文章目录: AI Agent概述 AI Agent的架构 AI Agent与相关技术的比较 AI Agent框架和平台 总结与未来展望 AI Agent概述 1.1 定义AI Agent AI Agent,或称为人工智能代理,我更愿意称为AI智能体。它是一种模拟人类智能行为的人工智能系统…