goaでバスの路線図APIを作る(API編)

goa design

前回のデザインをgoa のdesignに落とし込む。

goaの細かい使い方とかはチュートリアルとか見ながらやった。

デザインファイルにはざっくり下記を書く。

  • APIの定義

  • Serviceの定義(ルーティング、メソッド(GET,POST等)、レスポンス等の定義)

  • レスポンスデータの定義

ここの書き方がv1とv3で違いがあり、困った時に調べるのが難しいポイント。
詰まったポイントを下記にまとめる。

CORS設定

CORSを設定しないとブラウザとかからアクセスした時に弾かれる場合があるので設定したい。
(地図上に線を引く部分はブラウザで見れるように作る予定なので

v1ではそのまま書けるらしいが、v3ではプラグインを入れて書く。
使うプラグインは下記。

今回は公開するわけではないので上記チュートリアルと下記v1の記事を参考に書く。

https://github.com/goadesign/goa/issues/546

書いた結果は下記。

var _ = Service("rosenzu", func() {
	cors.Origin("*", func() {
		cors.Methods("GET")
		cors.Headers("Accept", "Content-Type")
		cors.Expose("Content-Type", "Origin")
		cors.Credentials()
	})
//...

MethodsやHeaders等の前にcorsが無いとダメだが、公式ページでは書かれていないので注意。

gorma

gormaは、以前使ったgormのコードをgoaのdesignから生成できる便利ツールなのだが、v3には対応していない。(なんで???

ここはリサーチ不足だったので諦めてgormを手動で使うことにした。

goa gen

designができたらデザインファイルからgoa genでコードを生成する。
自動生成されたコードがgenディレクトリ内に入る。
designが変わったらまたgoa genするのでgenの中は弄らない。

├── gen
│   ├── http
│   │   ├── cli
│   │   │   └── rosenzu
│   │   │       └── cli.go
│   │   ├── openapi.json
│   │   ├── openapi.yaml
│   │   ├── openapi3.json
│   │   ├── openapi3.yaml
│   │   └── rosenzu
│   │       ├── client
│   │       │   ├── cli.go
│   │       │   ├── client.go
│   │       │   ├── encode_decode.go
│   │       │   ├── paths.go
│   │       │   └── types.go
│   │       └── server
│   │           ├── encode_decode.go
│   │           ├── paths.go
│   │           ├── server.go
│   │           └── types.go
│   └── rosenzu
│       ├── client.go
│       ├── endpoints.go
│       ├── service.go
│       └── views
│           └── view.go
├── rosenzu.go

ファイル名がopenapi.*の物がSwaggerに入れるとドキュメントにしてくれるやつ。

goa example

goa genの後にgoa exampleを実行して、APIの裏側で動く処理(DBからデータを取ってくるとか)の雛形を生成する。
編集なしでも動作するが、雛形なので必要な部分を書いてく必要がある。
ここの実行は基本的に1回でよく、実行してもファイルがある場合はコード生成されない。

├── cmd
│   ├── rosenzu
│   │   ├── http.go
│   │   └── main.go
│   └── rosenzu-cli
│       ├── http.go
│       └── main.go

上記main.goをgo buildでビルドすると実行ファイルが生成される。

今回作ったdesignファイルは下記。

次回、バックエンド処理を書く。

この記事が気に入ったらサポートをしてみませんか?