Closed1

swaggerを試す

esakaesaka

前提知識

APIのIF仕様をyamlで書いて、表現できる的なやつだと思ってる
とりあえず手を動かして試してみる

go-swaggerで試す

https://future-architect.github.io/articles/20200824/

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と返ってくる

http://localhost:3000/hello?name=fooo

このスクラップは2021/01/11にクローズされました