スキップしてメイン コンテンツに移動

投稿

goa request parameters

Request この章では、APIリクエストのデザインについて説明していきます。
リクエストには、主に3種類、データの渡し方があります。

URLのPathに含まれる、リソースを識別するものとしてのパラメータQueryパラメータ(GETで良く使われる、?に続く文字列ですね)リクエストボディ
他にもHTTPリクエストという点では、HTTPヘッダも存在しますが、
HTTPヘッダはリクエストパラメータというより、
リクエストの形式や認証などに使われる、メタデータ的な意味合いがあるため
この章では扱いません。

それでは、それぞれの詳細を見ていきましょう。
Pathパラメータ RESTFulなAPIを扱うとき、良く出てくる

/user/:id -> /user/100
/product/:category/:product_id -> /product/book/300
のような、URLに含まれるパラメータですね。
正式名称は何というのでしょうか。

このパラメータは、Resourceを識別するために使われます。
Queryパラメータで識別しても良いのですが、Queryパラメータはどちらかというと、
APIの振る舞い・挙動を変える意味合いがあります。

この辺の考えは、RESTfulというアーキテクチャの話になってくるため、ここでは割愛します。

それでは実装してみましょう。
先ほどまでのソースコードを一旦、コミットします。
$ git add . $ git commit -m "first commit"
そして、デザインファイルにResourceを追加します。
var _ = Resource("products", func() { Action("show", func() { Routing(GET("products/:category_id/:product_id")) Params(func() { Param("category_id", Integer, "カテゴリID") Param("product_id", Integer, "プロダクトID") …
最近の投稿

自動生成されるファイル

自動生成されるファイル 先ほどのサンプルアプリケーションの作業ディレクトリには、
以下のファイル・ディレクトリがあります。
design/ app/ client/ swagger/ tool/ helloworld.go main.go
一つ一つ見ていきましょう。
生成物一覧
design/design.go
これは、最初に実装したデザインファイルになります。
アプリケーションの枠組みを決める設計図のようなものです。

goa独自のDSL(domain-specific language)を使って、APIの仕様を定義していきます。

app/
ここには、デザインされたアプリケーションの、実際に動くコードが生成されていきます。
基本的に、このディレクトリに格納されたファイルは編集不可(できるけど、しちゃだめ)と考えて良いです。

プログラマが追加実装しても、次にまたコード生成した場合、プログラマの追加実装は上書きされて消されてしまいます。

app/contexts.go
コンテキストが実装されています。
goaでは基本的に、API一つ一つに対して対応するコンテキストが実装されていきます。

コンテキストとは、HTTPリクエストを受け付けてからレスポンスを返すまで、
一連の流れが終わるまでの状態を表します。

2つのHTTPリクエストがあった場合、コンテキストは別々のオブジェクトとなります。
どのHTTPリクエストなのかを識別できるような、リクエスト毎の固有情報ですね。

コンテキストは3つのプロパティを持ち、
typeShowHelloworldContext struct { context.Context *goa.ResponseData *goa.RequestData}
Go標準のContextと、リクエスト・レスポンスを持っています。
app/controllers.go
コントローラのinterfaceが定義されています。
コントローラとは、Webアプリケーションでよく使われるデザインパターンMVC(Model View Controller)のControllerです。

コントローラはResource単位で生成され、今回のサンプルで言うと
HelloworldControllerというinterfaceが定義されています。

app/hrefs.go
Goa Hello World この章では、goaを使ってHello World!と表示させるAPIのサンプルを作ってみます。
何となくgoaとはどういうものか、感覚が掴めると思います。
セットアップ サンプルを作る土台作りをしましょう。
gvmgolang 1.7.5goa
の3つをインストールします。
※既にインストールしている場合は読み飛ばしてください
gvmをインストール サンプルはGoのバージョン1.7.5を使って作っていきます。
 それではまず、Goのバージョン管理ツールであるgvmをインストールしましょう。
$ bash < <(curl -s -S -L https://raw.githubusercontent.com/moovweb/gvm/master/binscripts/gvm-installer) $ source ~/.gvm/scripts/gvm $ gvm version
これで、gvmのバージョンが表示されたら成功です。
Goをインストール gvmを使ってGoをインストールします。
通常、gvmを使ってGoをインストールする場合は
$ gvm install go1.7.5
で良いのですが、Mac OSがSierra以上だと、コンパイルが失敗します。
※このブログを執筆している時点での話なので、そのうち解消しているかも知れません

なので-Bオプションを付けて、バイナリのみをインストールします。
$ gvm install go1.7.5 -B $ gvm use go1.7.5 $ go vesion
Goのバージョンが表示されたら成功です。
goaのインストール
$ go get -u github.com/goadesign/goa/... $ goagen version
goagenのバージョンが表示されたら成功です。
実装 セットアップが完了したところで、goaを使ってアプリケーションのデザインをしていきます。
 作業ディレクトリはgoasampleとしましょう。
$ cd $GOPATH/src $ mkdir goasample $ cd goasample
また、goaを進めるに当たって、
自分が何のファイルを実装する事になるのかどういうファイルが自動で作られる…

goa -Golang Web Application Framework-

Webアプリケーションフレームワーク goa
goaとは、GolangでWebアプリケーションを構築していくフレームワークです。

今流行りのマイクロサービスやAPIサーバを早急に構築できます。(HTMLを返すWebサーバももちろん、実装可能です)

早急といった言葉を使ったのは、Webアプリケーションを構築する際の

ルーティングリクエストパラメータの定義レスポンスパラメータの定義パラメータのバリデーションコントローラの定義
といった、ビジネスロジック以外の土台部分を自動で生成してくれて、
ビジネスロジックの実装に専念できるからです。

自動生成といっても、思い描いたものが勝手にできる訳ではなく、
goa独自のDSLを記述してアプリケーションの仕様を定義する(デザインする)必要があります。

goaではアプリケーションの枠組みを、design.go(デザインファイル)というAPIの定義書を作って生成していきます。

DSLを覚える学習コストはありますが、それに見合った以上の働きをしてくれます。

Webアプリケーションのフレームワークとして有名なRuby on Railsも、
お作法を知らないと、レールから外れた実装をする事になり複雑な実装になってしまいます。

が、Railsは世界中で使われてる有名なフレームワークとなっています。
その学習コスト以上に見合った以上の働きがあるからでしょう。

goaは、ビジネスロジックに没頭できる点において、Railsに匹敵できるほどポテンシャルを持っていると思います。
もちろん、RubyではなくGo言語なので、言語仕様上の違いがあり単純に比較はできません。

このブログでは、自分の学習結果のアウトプットとして、goaについての紹介を連載していきたいと思います。