Closed1
swaggerを試す
前提知識
APIのIF仕様をyamlで書いて、表現できる的なやつだと思ってる
とりあえず手を動かして試してみる
go-swaggerで試す
go-swaggerのインストール
go get -u github.com/go-swagger/go-swagger/cmd/swagger
swagger.ymlを用意して、コードを自動生成する
$ tree .
.
├── server
│ └── gen
└── swagger
└── swagger.yml
swagger.yml
swagger: "2.0"
info:
version: 1.0.0
title: Greeting Server
paths:
/hello:
get:
produces:
- text/plain
parameters:
- name: name
required: false
type: string
in: query
description: defaults to World if not given
operationId: getGreeting
responses:
200:
description: returns a greeting
schema:
type: string
description: contains the actual greeting as plain text
生成
$ swagger generate server -f ./swagger/swagger.yml -t server/gen
..
2021/01/10 23:52:13 preprocessing spec with option: minimal flattening
2021/01/10 23:52:13 building a plan for generation
2021/01/10 23:52:13 generation target server/gen
2021/01/10 23:52:13 target must reside inside a location in the $GOPATH/src or be a module
GOPATH以下でやれと怒られた
GOPATHで同じことやる
$ cd ~/go/src/github.com/esakat/
$ mv ~/work/swagger-test ./
$ cd swagger-test
$ swagger generate server -f ./swagger/swagger.yml -t server/gen
今度は無事ファイル生成された、が実行したらパッケージ不足エラー
$ go run server/gen/cmd/greeting-server-server/main.go --host 0.0.0.0 --port 3000
../../go-openapi/runtime/flagext/byte_size.go:4:2: cannot find package "github.com/docker/go-units" in any of:
/usr/local/go/src/github.com/docker/go-units (from $GOROOT)
/Users/akasetomoya/go/src/github.com/docker/go-units (from $GOPATH)
入れる
$ cd server/gen/
$ go get ./...
// もう一度試す
go run server/gen/cmd/greeting-server-server/main.go --host 0.0.0.0 --port 3000
2021/01/11 00:00:46 Serving greeting server at http://[::]:3000
今後はいけた
これで http://localhost/hello にアクセスする
operation GetGreeting has not yet been implemented
というメッセージ出る
実装する
serverパッケージ配下に以下を作る
(参考URLでfactoryパッケージとなってるのが、operationsに変わってそう)
package server
import (
"github.com/go-openapi/runtime/middleware"
// このパスは環境によって違う
"github.com/esakat/swagger-test/server/gen/restapi/operations"
)
func GetGreeting(p operations.GetGreetingParams) middleware.Responder {
payload := *p.Name
return operations.NewGetGreetingOK().WithPayload(payload)
}
そして自動生成コードの以下を変更する
server/gen/restapi/configure_greeting_server.go
import (
"crypto/tls"
"net/http"
"github.com/go-openapi/errors"
"github.com/go-openapi/runtime"
"github.com/go-openapi/runtime/middleware"
"github.com/esakat/swagger-test/server/gen/restapi/operations"
+ "github.com/esakat/swagger-test/server"
)
if api.GetGreetingHandler == nil {
api.GetGreetingHandler = operations.GetGreetingHandlerFunc(func(params operations.GetGreetingParams) middleware.Responder {
return middleware.NotImplemented("operation operations.GetGreeting has not yet been implemented")
})
}
+ api.GetGreetingHandler = operations.GetGreetingHandlerFunc(server.GetGreeting)
自動生成コード変えていいの?と思うけど、このコードのトップに以下のようなコメントがある
// This file is safe to edit. Once it exists it will not be overwritten
と、上書きされないそうなのでおk
これでmain.goを起動し直して、以下のようにアクセスすると、fooo
と返ってくる
このスクラップは2021/01/11にクローズされました