所以......我正在使用Gin框架为我的想法创建一个RESTful API,我遇到了以下问题 - 让我们说我有以下端点:
/a/:id/*action
/b/:id/*action
/c/:id/*action
所以,显然,当我没有给出任何动作时,我想返回给定ID的数据.意思是,我只是查询一些数据并返回它,这意味着功能基本相同,只返回的数据不同.
这是我的一个示例代码 -
func GetBusiness(c *gin.Context) {
businessID, err := strconv.Atoi(c.Param("id"))
if businessID == 0 || err != nil {
c.JSON(http.StatusBadRequest, gin.H{"success": false, "errorMessage": "Missing ID"})
}
business := &Business{}
business, err = business.Get(businessID)
if err != nil {
c.JSON(http.StatusBadRequest, gin.H{"success": false, "errorMessage": "Business not found"})
}
c.JSON(http.StatusOK, business)
}
Run Code Online (Sandbox Code Playgroud)
因此,显然,业务可以成为用户或其他任何东西.所以,经过长时间的阐述,我向你的观众提出的问题是,如何在这种情况下防止代码重复?我已经尝试过使用界面,但我仍然在努力解决围棋的OO性质,所以我真的很喜欢任何帮助.
提前致谢!
您可以采取一些措施来减少代码重复,但不幸的是,您将始终在编写一些样板文件,因为它具有明确的错误处理和缺乏OOP-ness.(这不一定是坏事!).
所以我目前唯一的建议是将常用功能放在中间件处理程序中,并将代码重构为litte,例如:
parseIdMiddleware := func(c *gin.Context) {
id, err := strconv.Atoi(c.Param("id"))
if businessID == 0 || err != nil {
c.AbortWithError(http.StatusBadRequest, errors.New("Missing ID"))
return
}
c.Set("id", id)
}
...
gin.Use(gin.ErrorLogger(), parseIdMiddleware)
Run Code Online (Sandbox Code Playgroud)
并重写你的处理程序
func GetBusiness(c *gin.Context) {
id := c.MustGet("id").(int)
business, err := store.GetBusiness(id)
if err != nil {
c.AbortWithError(http.StatusBadRequest, err)
return // don't forget this!
}
c.JSON(http.StatusOK, business)
}
Run Code Online (Sandbox Code Playgroud)
和往常一样,阅读其他人的代码!我推荐https://github.com/drone/drone.这应该可以很好地概述如何构建代码.
| 归档时间: |
|
| 查看次数: |
676 次 |
| 最近记录: |