既然goa框架自動生成啦swagger-json文件,那么如何用swagger-ui展示出來呢?
這里分三步:
1.下載swagger-ui的web代碼
2.添加swagger.json 和 swagger-ui資源的導出
3.main.go里面mount這兩個資源,然后編譯啟動程序,訪問即可
為什么連swagger-ui一並導出?因為在swagger-ui中的test程序,需要請求api,如果時部署在不同端口,會有跨域請求問題(這個坑我踩了)。
跨域請求解決有很多方法:
1)把所有api設置為可接受跨域請求
2)把程序和swagger-ui部署到同一個域名下(或者設置代理訪問)
3)其它
這里選擇了第2種方法(順便使用goa里面到Files這個controller)。
不多廢話,繼續。。。
1.下載swagger-ui的web代碼
直接從swagger-ui的git上拉下來,然后我們要用的就是dist目錄里頭的文件。
2.添加swagger.json 和 swagger-ui資源的導出
package design import ( . "github.com/goadesign/goa/design" . "github.com/goadesign/goa/design/apidsl" ) //這里的host會生成swagger host var _ = API("adder", func() { Title("The adder API") Description("A teaser for goa") Host("localhost:8080") Scheme("http") }) var _ = Resource("operands", func() { Action("add", func() { Routing(GET("add/:left/:right")) Description("add returns the sum of the left and right parameters in the response body") Params(func() { Param("left", Integer, "Left operand") Param("right", Integer, "Right operand") }) Response(OK, "text/plain") }) Action("des", func() { Routing(GET("des/:left/:right")) Description("des returns the sum of the left and right parameters in the response body") Params(func() { Param("left", Integer, "Left operand") Param("right", Integer, "Right operand") }) Response(OK, "text/plain") }) })
//這里,添加josn和swagger-ui的資源導出 var _ = Resource("swagger", func() { Origin("*", func() { Methods("GET") // Allow all origins to retrieve the Swagger JSON (CORS) }) Files("/swagger.json", "swagger/swagger.json") }) var _ = Resource("swagger-ui", func() {
//建立靜態httpserver Files("/swagger-ui/*filepath", "swagger-ui/") })
然后重新生成代碼:
~/gocode/src/playgoa/demo$ goagen bootstrap -d playgoa/demo/design
這個時候,會有兩個新的文件:
swagger.go
swagger-ui.go
3.main.go里面mount這兩個資源,然后編譯啟動程序,訪問即可
然后,需要修改main.go文件
package main import ( "playgoa/demo/app" "github.com/goadesign/goa" "github.com/goadesign/goa/middleware" ) func main() { // Create service service := goa.New("adder") // Mount middleware service.Use(middleware.RequestID()) service.Use(middleware.LogRequest(true)) service.Use(middleware.ErrorHandler(service, true)) service.Use(middleware.Recover()) // Mount "operands" controller c := NewOperandsController(service) app.MountOperandsController(service, c) //add swagger s := NewSwaggerController(service) app.MountSwaggerController(service, s) //add swagger-ui sui := NewSwaggerUIController(service) app.MountSwaggerUIController(service, sui) // Start service if err := service.ListenAndServe(":8080"); err != nil { service.LogError("startup", "err", err) } }
然后編譯程序:
~/gocode/src/playgoa/demo$ go build -o playgoa
這里別忘記了把swagger-ui中的dist目錄下的所有文件,copy到demo目錄下的swagger-ui下哦
qingping.zhang@bogon ~/gocode/src/playgoa/demo$ ll total 20704 drwxr-xr-x 8 qingping.zhang staff 272 7 18 11:54 app drwxr-xr-x 8 qingping.zhang staff 272 7 18 11:54 client drwxr-xr-x 3 qingping.zhang staff 102 7 18 11:54 design -rw-r--r-- 1 qingping.zhang staff 794 7 18 11:46 main.go -rw-r--r-- 1 qingping.zhang staff 807 7 17 18:57 operands.go -rwxr-xr-x 1 qingping.zhang staff 10582972 7 18 12:13 playgoa drwxr-xr-x 4 qingping.zhang staff 136 7 18 11:54 swagger drwxr-xr-x 11 qingping.zhang staff 374 7 18 10:58 swagger-ui -rw-r--r-- 1 qingping.zhang staff 383 7 18 11:49 swagger-ui.go -rw-r--r-- 1 qingping.zhang staff 363 7 17 19:10 swagger.go
#在這里。。。 qingping.zhang@bogon ~/gocode/src/playgoa/demo$ ll swagger-ui total 4160 drwxr-xr-x 7 qingping.zhang staff 238 7 18 10:58 css drwxr-xr-x 4 qingping.zhang staff 136 7 18 10:58 fonts drwxr-xr-x 12 qingping.zhang staff 408 7 18 10:58 images -rw-r--r-- 1 qingping.zhang staff 4314 7 18 10:58 index.html drwxr-xr-x 15 qingping.zhang staff 510 7 18 10:58 lang drwxr-xr-x 16 qingping.zhang staff 544 7 18 10:58 lib -rw-r--r-- 1 qingping.zhang staff 449 7 18 10:58 o2c.html -rw-r--r-- 1 qingping.zhang staff 1823645 7 18 10:58 swagger-ui.js -rw-r--r-- 1 qingping.zhang staff 289384 7 18 10:58 swagger-ui.min.js
啟動運行./playgoa
然后訪問:http://localhost:8080/swagger-ui/index.html 就可以看到效果了。