如何一键生成通用的web服务(gin)完整项目代码,让你的开发效率提升10倍

生成CRUD的api接口代码工具都比较成熟了,CRUD代码都是标准化固定化的,比较容易生成,对于任意自定义的api接口代码,应该不少开发者还是手工编写,这些不是标准化接口代码,应该如何生成呢?

这里的解决方案是使用protobuf协议来描述api接口,通过插件protoc-gen-go-gin生成web服务的任意api接口代码。

生成通用web服务代码生成任意api接口代码这两个功能已经集成在生成代码工具sponge中。

安装完sponge后,执行命令打开UI界面:

sponge run

快速创建web项目

创建web服务前先准备一个proto文件,proto文件要求必须包含路由描述信息swagger描述信息,user.proto文件内容如下:

syntax = "proto3";

package api.edusys.v1;

import "google/api/annotations.proto";
import "protoc-gen-openapiv2/options/annotations.proto";

option go_package = "edusys/api/user/v1;v1";

// 生成*.swagger.json基本信息
option (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_swagger) = {
  host: "localhost:8080"
  base_path: ""
  info: {
    title: "user api docs";
    version: "v0.0.0";
  };
  schemes: HTTP;
  schemes: HTTPS;
  consumes: "application/json";
  produces: "application/json";
};

service user {
  rpc Register(RegisterRequest) returns (RegisterReply) {
    option (google.api.http) = {
      post: "/api/v1/register"
      body: "*"
    };
    option (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_operation) = {
      summary: "注册用户",
      description: "提交信息注册",
      tags: "user",
    };
  }
}

message RegisterRequest {
  string email = 1;
  string password = 2;
}

message RegisterReply {
  int64   id = 1;
}

进入sponge的UI界面,点击左边菜单栏【protobuf】–> 【Web类型】–>【创建web项目】,填写一些参数就可以生成web服务项目代码了。

web框架使用 gin,还包含了swagger文档、常用的服务治理功能代码,构建部署脚本等,使用什么数据库由自己选择。

生成web服务项目代码的详细演示过程请看B站视频 https://www.bilibili.com/video/BV1CX4y1D7xj/

生成web服务代码

切换到web目录,执行命令:

# 生成api接口代码,生成注册路由代码,生成swagger文档
make docs

# 打开internal/handler/user_logic.go,这是生成的api接口代码,里面有一行提示填写业务逻辑代码的panic代码,在这里填写业务逻辑
# api接口的注册路由、输入参数和返回结果的go结构体代码、swagger文档、定义错误码都已经生成了,只需填写业务逻辑代码

# 编译和启动web服务
make run

在浏览器打开 http://localhost:8080/apis/swagger/index.html 就可以测试api接口了。

swagger界面


批量添加任意api接口代码嵌入到web服务

在web服务目录api/user/v1下的proto文件添加登录和登出2个api接口,也可以在新创建的proto文件添加api接口,新添加内容如下:

// api 接口的路由和swagger描述
  rpc Login(LoginRequest) returns (LoginReply) {
    option (google.api.http) = {
      post: "/api/v1/login"
      body: "*"
    };
    option (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_operation) = {
      summary: "登录",
      description: "登录",
      tags: "user",
    };
  }

  rpc Logout(LogoutRequest) returns (LogoutReply) {
    option (google.api.http) = {
      post: "/api/v1/logout"
      body: "*"
    };
    option (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_operation) = {
      summary: "登出",
      description: "登出",
      tags: "user",
    };
  }

// --------------------------------------

message LoginRequest {
  string email = 1;
  string password = 2;
}

message LoginReply {
  string token = 1;
}

message LogoutRequest {
  string token = 1;
}

message LogoutReply {}

添加api接口的详细演示过程请看B站视频 https://www.bilibili.com/video/BV1P54y1g7J9/

切换到web目录,执行命令:

# 生成api接口代码,生成注册路由代码,生成swagger文档
make proto

# 进入internal/handler/目录,打开带有日期后缀的文件,把新添加的接口代码复制到user_logic.go文件中,去掉panic代码提示代码,并填写业务逻辑

# 清除带有日期后缀文件
make clean

# 编译和启动web服务
make run

在浏览器打开 http://localhost:8080/apis/swagger/index.html 就可以测试api接口了。

swagger界面2

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
好的,以下是一段基于gin和gorm的web项目代码示例: ```go package main import ( "github.com/gin-gonic/gin" "gorm.io/driver/mysql" "gorm.io/gorm" ) type User struct { ID uint `gorm:"primaryKey"` Name string `gorm:"not null"` Age int `gorm:"not null"` } func main() { dsn := "user:password@tcp(127.0.0.1:3306)/db_name?charset=utf8mb4&parseTime=True&loc=Local" db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{}) if err != nil { panic("failed to connect database") } // Auto Migrate db.AutoMigrate(&User{}) r := gin.Default() // Get all users r.GET("/users", func(c *gin.Context) { var users []User db.Find(&users) c.JSON(200, users) }) // Create a user r.POST("/users", func(c *gin.Context) { var user User if err := c.ShouldBindJSON(&user); err != nil { c.JSON(400, gin.H{"error": err.Error()}) return } db.Create(&user) c.JSON(200, user) }) // Get a user by ID r.GET("/users/:id", func(c *gin.Context) { var user User if err := db.First(&user, c.Param("id")).Error; err != nil { c.JSON(404, gin.H{"error": "User not found"}) return } c.JSON(200, user) }) // Update a user by ID r.PUT("/users/:id", func(c *gin.Context) { var user User if err := db.First(&user, c.Param("id")).Error; err != nil { c.JSON(404, gin.H{"error": "User not found"}) return } if err := c.ShouldBindJSON(&user); err != nil { c.JSON(400, gin.H{"error": err.Error()}) return } db.Save(&user) c.JSON(200, user) }) // Delete a user by ID r.DELETE("/users/:id", func(c *gin.Context) { var user User if err := db.First(&user, c.Param("id")).Error; err != nil { c.JSON(404, gin.H{"error": "User not found"}) return } db.Delete(&user) c.JSON(200, gin.H{"message": "User deleted"}) }) r.Run(":8080") } ``` 这段代码实现了一个简单的用户管理系统,可以通过HTTP接口进行用户的增删改查操作。其中使用了gin作为HTTP框架,gorm作为ORM框架,MySQL作为数据库。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值