自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

在 Go 應(yīng)用中像 FastAPI 一樣優(yōu)雅地構(gòu)建控制器

開(kāi)發(fā) 前端
go-rest-kit 為 Go 開(kāi)發(fā)者提供了一種類似 FastAPI 的優(yōu)雅方式來(lái)構(gòu)建 RESTful API。它通過(guò)自動(dòng)請(qǐng)求解析、預(yù)定義控制器方法和可擴(kuò)展的組件設(shè)計(jì),大大簡(jiǎn)化了 API 開(kāi)發(fā)流程,提高了代碼的可讀性和可維護(hù)性。

在 Python 中,F(xiàn)astAPI 憑借其自動(dòng)請(qǐng)求解析、數(shù)據(jù)驗(yàn)證和類型提示等強(qiáng)大功能,成為了構(gòu)建 API 的熱門框架。然而,在 Go 語(yǔ)言中,卻鮮少有框架能夠提供類似的便捷體驗(yàn)。開(kāi)發(fā)者往往需要在每個(gè) API 處理程序中重復(fù)編寫相同的解析和錯(cuò)誤處理邏輯,這無(wú)疑增加了代碼的冗余度和維護(hù)成本。

go-rest-kit 的出現(xiàn)正是為了解決這一痛點(diǎn)。它提供了一套現(xiàn)成的包,可以幫助開(kāi)發(fā)者快速構(gòu)建基于 Gin 框架的 RESTful API,并通過(guò)類似 FastAPI 的方式定義控制器,從而避免重復(fù)編寫繁瑣的代碼。

go-rest-kit 的設(shè)計(jì)理念

go-rest-kit 的核心目標(biāo)是簡(jiǎn)化 Go 應(yīng)用中 REST API 的開(kāi)發(fā)流程,其設(shè)計(jì)理念主要體現(xiàn)在以下幾個(gè)方面:

  • 自動(dòng)請(qǐng)求解析和驗(yàn)證:  go-rest-kit 利用 Go 的類型系統(tǒng)和結(jié)構(gòu)體標(biāo)簽,實(shí)現(xiàn)了類似 FastAPI 的自動(dòng)請(qǐng)求解析和驗(yàn)證功能。開(kāi)發(fā)者只需定義好請(qǐng)求和響應(yīng)的數(shù)據(jù)結(jié)構(gòu),并添加相應(yīng)的標(biāo)簽,即可自動(dòng)完成數(shù)據(jù)的綁定和校驗(yàn)。
  • 控制器方法: go-rest-kit 提供了一系列預(yù)定義的控制器方法,例如 Create、Retrieve、Update、Delete 等,涵蓋了常見(jiàn)的 CRUD 操作。開(kāi)發(fā)者只需將這些方法與路由綁定,即可快速構(gòu)建 API 接口。
  • 可擴(kuò)展性:  go-rest-kit 的各個(gè)組件都設(shè)計(jì)為可插拔的,開(kāi)發(fā)者可以根據(jù)自身需求,替換或擴(kuò)展默認(rèn)的實(shí)現(xiàn)。例如,可以使用自定義的數(shù)據(jù)庫(kù)訪問(wèn)層、身份驗(yàn)證機(jī)制等。

快速上手

安裝

go get github.com/krsoninikhil/go-rest-kit

示例:構(gòu)建 CRUD API

以下示例演示了如何使用 go-rest-kit 構(gòu)建一個(gè)簡(jiǎn)單的 CRUD API:

// models.go
package models

import (
 "fmt"

 "github.com/krsoninikhil/go-rest-kit/pgdb"
)

// BusinessType represents a business type entity.
type BusinessType struct {
 Name string `json:"name"`
 Icon string `json:"icon"`
 pgdb.BaseModel
}

// ResourceName returns the resource name of the BusinessType model.
func (b BusinessType) ResourceName() string {
 return fmt.Sprintf("%T", b)
}
// entities.go
package types

// BusinessTypeRequest represents the request payload for creating or updating a business type.
type BusinessTypeRequest struct {
 Name string `json:"name" binding:"required"`
 Icon string `json:"icon"`
}

// BusinessTypeResponse represents the response payload for a business type.
type BusinessTypeResponse struct {
 BusinessTypeRequest
 ID int `json:"id"`
}

// ToModel converts a BusinessTypeRequest to a BusinessType model.
func (b BusinessTypeRequest) ToModel(_ *gin.Context) models.BusinessType {
 return models.BusinessType{Name: b.Name, Icon: b.Icon}
}

// FillFromModel fills a BusinessTypeResponse with data from a BusinessType model.
func (b BusinessTypeResponse) FillFromModel(m models.BusinessType) crud.Response[models.BusinessType] {
 return BusinessTypeResponse{
  ID:               m.ID,
  BusinessTypeRequest: BusinessTypeRequest{Name: m.Name, Icon: m.Icon},
 }
}

// ItemID returns the ID of the business type.
func (b BusinessTypeResponse) ItemID() int { return b.ID }
// main.go
package main

import (
 "fmt"

 "github.com/gin-gonic/gin"
 "github.com/krsoninikhil/go-rest-kit/crud"
 "github.com/krsoninikhil/go-rest-kit/request"
)

func main() {
 // Assuming you have a database connection `db` and a business type DAO `businessTypeDao`
 businessTypeDao := crud.Dao[models.BusinessType]{PGDB: db}
 businessTypeCtlr := crud.Controller[models.BusinessType, types.BusinessTypeResponse, types.BusinessTypeRequest]{
  Svc: &businessTypeDao,
 }

 r := gin.Default()
 r.GET("/business-types", request.BindGet(businessTypeCtlr.Retrieve))
 r.GET("/business-types", request.BindGet(businessTypeCtlr.List))
 r.POST("/business-types", request.BindCreate(businessTypeCtlr.Create))
 r.PATCH("/business-types", request.BindUpdate(businessTypeCtlr.Update))
 r.DELETE("/business-types", request.BindDelete(businessTypeCtlr.Delete))

 // Start your server
}

在上面的示例中,我們首先定義了 BusinessType 模型、BusinessTypeRequest 請(qǐng)求結(jié)構(gòu)體和 BusinessTypeResponse 響應(yīng)結(jié)構(gòu)體。然后,我們創(chuàng)建了一個(gè) crud.Controller 實(shí)例,并將 businessTypeDao 作為服務(wù)注入其中。最后,我們使用 request 包提供的綁定方法將控制器方法與路由綁定起來(lái)。

示例:加載應(yīng)用程序配置

go-rest-kit 提供了便捷的配置加載機(jī)制,支持從 YAML 文件和環(huán)境變量中讀取配置信息。

// config.go
package config

import (
 "fmt"

 "github.com/krsoninikhil/go-rest-kit/auth"
 "github.com/krsoninikhil/go-rest-kit/pgdb"
 "github.com/krsoninikhil/go-rest-kit/twilio"
)

// Config defines the application configuration structure.
type Config struct {
 DB     pgdb.Config
 Twilio twilio.Config
 Auth   auth.Config
 Env    string
}

// EnvPath returns the path to the .env file.
func (c *Config) EnvPath() string { return "./.env" }

// SourcePath returns the path to the YAML configuration file.
func (c *Config) SourcePath() string { return fmt.Sprintf("./api/%s.yml", c.Env) }

// SetEnv sets the environment for the configuration.
func (c *Config) SetEnv(env string) { c.Env = env }
// main.go
package main

import (
 "context"

 "github.com/krsoninikhil/go-rest-kit/config"
)

func main() {
 var (
  ctx  = context.Background()
  conf Config
 )

 config.Load(ctx, &conf)

 // Use the loaded configuration
 db := pgdb.NewPGConnection(ctx, conf.DB)
 // ...
}

在上面的示例中,我們定義了 Config 結(jié)構(gòu)體,并實(shí)現(xiàn)了 config.AppConfig 接口。然后,我們使用 config.Load 方法加載配置信息。

核心包詳解

go-rest-kit 包含以下核心包:

  • request: 提供基于請(qǐng)求類型的參數(shù)綁定功能,允許控制器方法直接接收解析后的請(qǐng)求參數(shù)和請(qǐng)求體,避免在每個(gè)控制器中重復(fù)編寫解析邏輯。
  • crud:  提供用于常見(jiàn) CRUD 操作的控制器,例如 crud.Controller 和 crud.NestedController。
  • apperrors: 提供應(yīng)用程序中常用的錯(cuò)誤類型,例如 apperrors.NewServerError、apperrors.NewNotFoundError 等。
  • config: 提供快速加載和解析配置文件的方法,支持從 YAML 文件和環(huán)境變量中讀取配置信息。
  • pgdb: 提供 PostgreSQL 數(shù)據(jù)庫(kù)連接配置和創(chuàng)建方法。
  • integrations: 提供常用的第三方客戶端,例如 Twilio 客戶端,用于發(fā)送 OTP 短信驗(yàn)證碼。
  • auth: 提供與身份驗(yàn)證相關(guān)的功能,例如注冊(cè)、登錄、OTP 驗(yàn)證、令牌刷新等。

總結(jié)

go-rest-kit 為 Go 開(kāi)發(fā)者提供了一種類似 FastAPI 的優(yōu)雅方式來(lái)構(gòu)建 RESTful API。它通過(guò)自動(dòng)請(qǐng)求解析、預(yù)定義控制器方法和可擴(kuò)展的組件設(shè)計(jì),大大簡(jiǎn)化了 API 開(kāi)發(fā)流程,提高了代碼的可讀性和可維護(hù)性。

如果您正在使用 Go 語(yǔ)言開(kāi)發(fā) REST API,不妨嘗試一下 go-rest-kit,相信它會(huì)讓您的開(kāi)發(fā)體驗(yàn)更加流暢和高效。

責(zé)任編輯:武曉燕 來(lái)源: 源自開(kāi)發(fā)者
相關(guān)推薦

2025-01-09 10:32:05

2023-02-15 08:17:20

VSCodeTypeScrip

2021-04-12 10:20:20

Java微服務(wù)Go

2023-04-05 14:19:07

FlinkRedisNoSQL

2022-10-21 13:52:56

JS 報(bào)錯(cuò)調(diào)試本地源碼

2020-11-17 15:31:23

Java微服務(wù)Go

2022-01-10 21:00:12

LinuxGNOME截圖工具

2022-12-13 07:41:43

CSSCSS Houdi

2013-12-17 09:02:03

Python調(diào)試

2022-12-21 15:56:23

代碼文檔工具

2023-05-23 13:59:41

RustPython程序

2013-12-31 09:19:23

Python調(diào)試

2017-10-17 14:47:02

AndriodGradle依賴

2016-03-01 17:48:32

WLAN控制器網(wǎng)絡(luò)管理

2021-04-20 15:38:56

iOS平臺(tái)應(yīng)用分發(fā)開(kāi)發(fā)者

2015-03-16 12:50:44

2013-08-22 10:17:51

Google大數(shù)據(jù)業(yè)務(wù)價(jià)值

2021-05-20 08:37:32

multiprocesPython線程

2011-01-18 10:45:16

喬布斯
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)