[beego]自动化API文档的路由经常失效。

2024-07-19 972 views
1

| \ | |/ / __ | \ / \ / \ | |/ /| /| / ___/ \| ___| v2.0.2

├── Beego : Beego is not installed. Please do consider installing it first: https://github.com/beego/beego/v2. If you are using go mod, and you don't install the beego under $GOPATH/src/github.com/astaxie, just ignore this. ├── GoVersion : go1.15.6 ├── GOOS : linux ├── GOARCH : amd64 ├── NumCPU : 4 ├── GOPATH : /datas/e_drive/goproject ├── GOROOT : /home/sakura/apphome/go ├── Compiler : gc └── Date : Monday, 11 Jan 2021

“GO ENV“ GO111MODULE="on" GOARCH="amd64" GOBIN="" GOCACHE="/home/sakura/.cache/go-build" GOENV="/home/sakura/.config/go/env" GOEXE="" GOFLAGS="" GOHOSTARCH="amd64" GOHOSTOS="linux" GOINSECURE="" GOMODCACHE="/datas/e_drive/goproject/pkg/mod" GONOPROXY="" GONOSUMDB="" GOOS="linux" GOPATH="/datas/e_drive/goproject" GOPRIVATE="" GOPROXY="https://proxy.golang.org,direct" GOROOT="/home/sakura/apphome/go" GOSUMDB="sum.golang.org" GOTMPDIR="" GOTOOLDIR="/home/sakura/apphome/go/pkg/tool/linux_amd64" GCCGO="gccgo" AR="ar" CC="gcc" CXX="g++" CGO_ENABLED="1" GOMOD="/dev/null" CGO_CFLAGS="-g -O2" CGO_CPPFLAGS="" CGO_CXXFLAGS="-g -O2" CGO_FFLAGS="-g -O2" CGO_LDFLAGS="-g -O2" PKG_CONFIG="pkg-config" GOGCCFLAGS="-fPIC -m64 -pthread -fmessage-length=0 -fdebug-prefix-map=/tmp/go-build843580340=/tmp/go-build -gno-record-gcc-switches"

我需要写一个类似”@router /Level [get]“的接口 但是自动话文档生成了这个接口之后调用经常404

后来我那bee api生成的样例直接测试也是会404

controllers/object.go `package controllers

import ( "muapi/models" "encoding/json"

beego "github.com/beego/beego/v2/server/web"

)

// Operations about object type ObjectController struct { beego.Controller }

// @Title Create // @Description create object // @Param body body models.Object true "The object content" // @Success 200 {string} models.Object.Id // @Failure 403 body is empty // @router /test [post] func (o *ObjectController) Post() { var ob models.Object json.Unmarshal(o.Ctx.Input.RequestBody, &ob) objectid := models.AddOne(ob) o.Data["json"] = map[string]string{"ObjectId": objectid} o.ServeJSON() }

// @Title GetAll // @Description get all objects // @Success 200 {object} models.Object // @Failure 403 :objectId is empty // @router / [get] func (o *ObjectController) GetAll() { obs := models.GetAll() o.Data["json"] = obs o.ServeJSON() }`

routers/commentsRouter_controllers.go `package routers

import ( beego "github.com/beego/beego/v2/server/web" "github.com/beego/beego/v2/server/web/context/param" )

func init() {

beego.GlobalControllerRouter["muapi/controllers:ObjectController"] = append(beego.GlobalControllerRouter["muapi/controllers:ObjectController"],
    beego.ControllerComments{
        Method: "GetAll",
        Router: "/",
        AllowHTTPMethods: []string{"get"},
        MethodParams: param.Make(),
        Filters: nil,
        Params: nil})

beego.GlobalControllerRouter["muapi/controllers:ObjectController"] = append(beego.GlobalControllerRouter["muapi/controllers:ObjectController"],
    beego.ControllerComments{
        Method: "Post",
        Router: "/test",
        AllowHTTPMethods: []string{"post"},
        MethodParams: param.Make(),
        Filters: nil,
        Params: nil})

……`

图片

尝试过删除commentsRouter_controllers.go文件再启动也是不行。

回答

5

你是否调用了 Include方法?

0

不好意思,这两天没有看git。我上面贴出的测试是用的bee工具生成的api模板试的,没有动里面的调用,只是改了一个object.go文件里的// @router / [post] 为// @router /test [post]而已,其他的都没动。

6

好的,我来试试。

3

image 我这里没有任何的问题=。=

5

你可以确认一下,你生成的router里面有没有这个: image 因为路由代码只会在runmode = dev环境下生成

2

我第一个帖里已经贴出了routers/commentsRouter_controllers.go里的内容了。。。里面是有生成路由的,你可以多改几次 @router 的定义例如在这个基础上改为 @router /test01 [post]再重启试试,我之前试过创建完API模板直接修改 @router 再启动是正常的,但是再修改成其他的重启就不行了。

9

刚刚我在我环境上试了一下发现一个现象,在我每次改过@route之后,得先停止应用执行一次go mod tidy之后再启动应用路由就能够正常的加载,调用也能成功,但是改完@route 不执行go mod tidy由bee自动重载应用虽然有路由生成但是访问的时候就是404。

3

我特么终于知道了!!!! 是初始化顺序的问题!!!! image image image

那个init先执行是不确定的。

你是不是也是这种依赖于init的注册方式?

3

哦哦。。原来是这样。我这边也是init注册方式的。那目前这种情况需要怎么解决呢?不用bee生成的路由?我也是刚学这些,出现这种问题暂时没法独立解决,麻烦大佬费心了。。。

5

我计划是把自动生成的router放到一个单独的package下,之前也有人报过另外一个相似的BUG,我觉得放到诸如router/generated这种子目录可能更合适。

1

image image

其实就是Include的那一步,显示调用,而不再是放到init方法里面就可以了。