本教程将指导您使用 Go、Gin 框架以及开源库 ginvalidator
和 validatorgo
创建基本的 RESTful API。 这些库简化了输入验证,使您的 API 更加健壮。
我们将构建一个用于管理产品库存的 API。 该 API 将支持创建、读取、更新和删除产品。 为简单起见,数据将存储在内存中(而不是持久数据库)。 这意味着服务器重新启动时数据会丢失。 您可以使用 Postman 或 Insomnia 等工具来测试 API。
API 端点设计:
API 将具有以下端点:
/products
:GET
:检索所有产品的 JSON 列表。POST
:添加新产品(需要 JSON 负载)。/products/:id
:GET
:通过 ID 检索单个产品(JSON 响应)。PUT
:通过 ID 更新产品(需要 JSON 负载)。DELETE
:通过 ID 删除产品。代码实现:
依赖项: 安装必要的软件包:gin-gonic/gin
、bube054/ginvalidator
和 bube054/validatorgo
。
数据结构:定义结构来表示产品数据:
<code class="language-go">package main import ( "time" ) type Dimensions struct { Length float64 `json:"length"` Width float64 `json:"width"` Height float64 `json:"height"` Weight float64 `json:"weight"` } type Supplier struct { Name string `json:"name"` Contact string `json:"contact"` Address string `json:"address"` } type Product struct { ID string `json:"id"` Name string `json:"name"` Category string `json:"category"` Description string `json:"description"` Price float64 `json:"price"` Stock int `json:"stock"` Dimensions Dimensions `json:"dimensions"` Supplier Supplier `json:"supplier"` Tags []string `json:"tags"` Image string `json:"image"` ManufacturedAt time.Time `json:"manufacturedAt"` CreatedAt time.Time `json:"createdAt"` UpdatedAt time.Time `json:"updatedAt"` }</code>
<code class="language-go">var products = []Product{ // ... (Initial product data as in the original example) ... }</code>
ginvalidator
创建中间件函数来验证查询参数和请求正文:<code class="language-go">func productQueriesValidators() gin.HandlersChain { return gin.HandlersChain{ gv.NewQuery("q", nil).Chain().Optional().Trim(" ").Not().Empty(nil).Validate(), gv.NewQuery("order", nil).Chain().Optional().Trim(" ").In([]string{"asc", "desc"}).Validate(), } } func productParamIdValidators() gin.HandlersChain { return gin.HandlersChain{gv.NewParam("id", nil).Chain().Trim(" ").Alphanumeric(nil).Validate()} } func productBodyValidators() gin.HandlersChain { // ... (Validation rules as in the original example) ... }</code>
<code class="language-go">func getProducts(c *gin.Context) { // ... (Handler logic as in the original example) ... } func getProduct(c *gin.Context) { // ... (Handler logic as in the original example) ... } func deleteProduct(c *gin.Context) { // ... (Handler logic as in the original example) ... } func postProduct(c *gin.Context) { // ... (Handler logic as in the original example) ... } func putProducts(c *gin.Context) { // ... (Handler logic as in the original example) ... }</code>
main
函数中注册API路由:<code class="language-go">func main() { router := gin.Default() router.GET("/products", append(productQueriesValidators(), getProducts)...) router.GET("/products/:id", append(productParamIdValidators(), getProduct)...) router.DELETE("/products/:id", append(productParamIdValidators(), deleteProduct)...) router.POST("/products", append(productBodyValidators(), postProduct)...) router.PUT("/products/:id", append(append(productParamIdValidators(), productBodyValidators()...), putProducts)...) router.Run(":8080") }</code>
完整的更新代码(包括步骤 3、4 和 5 中省略的部分)与原始示例的“完整代码”部分相同。 请记住将 // ...
注释替换为原始响应中提供的代码。 此修订后的解释阐明了步骤并使该过程更易于遵循。
以上是使用 Gin、ginvalidator 和 validatorgo 开发简单的 RESTful API的详细内容。更多信息请关注PHP中文网其他相关文章!