GrailsアプリにWebサービスで使用できるRESTful API(主にCRUDアクション)を提供するための最良のアプローチは何だろうと思っていました、例えばブラウザベースのアプリやその他のものに対応するiOSアプリを構築する場合。
私は、Service Layerを再利用できるように、www.mywebapp.com/api/someAction
からの呼び出しを受け取るGrailsアプリケーションに別のパーツを作成することを考えました。では、どのようにしてURLマッピングを行うのでしょうか。大きなApiController
が1つしかない場合は、あまりグルーヴィーに聞こえません。
または、私が知らなかったより良いアプローチはありますか?このアプローチmustは、OAuthのようなものをサポートして、Webサービスを呼び出しているユーザーを認証します。
GrailsはdefinitelyでREST APIを提供できますが、そうすることの難しさのレベルは mature (aka。how RESTful)APIになりたい。
HTTP動詞の全範囲を使用してリソースのjsonまたはxml表現を操作し、HTTP応答コードを活用するというRESTfulnessの基本レベルを取得することは、非常に簡単です。それを実現するための3つの主要な要素があります。
以下は、RESTfulなURLを増やすために、最近のプロジェクトでURLマッピングをどのように記述したかの例です。
// RESTful list mapping
name restEntityList: "/$controller"(parseRequest: true) {
action = [GET: "list", POST: "save"]
}
// RESTful entity mapping
name restEntity: "/$controller/$id"(parseRequest: true) {
action = [GET: "show", PUT: "update", POST: "update", DELETE: "delete"]
constraints {
id matches: /\d+/
}
}
Grailsがコンテンツネゴシエーションを処理できる3つの異なる方法により、フレームワークは非常に柔軟になり、Accept HTTPヘッダーなどを設定できない可能性のあるはるかに幅広いクライアントをサポートできます。
コンテンツネゴシエーションを使用して、クライアントが希望するものに基づいて withFormat
ブロックを使用して、さまざまな方法でさまざまな要求に応答できます。この強力な機能は、 Githubが行う方法 のように、APIのバージョン管理にも使用できます。
HTTPにはすでに、優れた応答メカニズムが組み込まれており、キャッシュ機能やべき等演算など、アーキテクチャの固有の機能を活用できます。一部のWebブラウザーは特定の応答コードを適切に処理しませんが、APIを使用するクライアントアプリケーションはそれらを使用して内部コードを大幅に簡略化できます。
CRUDは基本的にすべてのドメインオブジェクトで同じであるため、アプリケーションをRESTfulにし、同時にDRYに保つための最良の方法の1つは、コントローラーのスキャフォールディングをできるだけ活用することです。 この記事 デフォルトコントローラーをよりRESTfulにする方法、および この記事 デフォルトコントローラーを簡略化する方法は、どちらもスキャフォールディングからより多くのパワーを得るのに優れたリソースです。
その時点で、Grailsアプリケーション用のかなり機能的なREST APIができました。基本的なCRUD操作はすべて実行でき、リソースの操作はかなり簡単です。
しかし、真のRESTfulハイパーメディアAPIへのはしごの次のレベルはmuch達成が困難です。これを修正することはGrailsのロードマップにありますが、現在はかなり苦痛です。これらの部分は次のとおりです。
ありがたいことに、カスタムマーシャラーの定義を非常に簡単にする プラグイン があり、RESTパズルの残りの3つのピースをかなり簡単にカバーできます。
最後に、全体を保護する側面があります。一般に、 Spring Security は、APIへのユーザーアクセスを保護する限り、適切に保持します。ほとんどのAPIアクセスはアプリケーションからであり、ユーザーには表示されないため、通常、基本認証またはダイジェスト認証が最も簡単な方法です。ありisOAuthプラグイン これはSpring Securityに基づいて構築されています。個人的には使っていないので安定性は保証できませんが、なかなか良さそうです。
一般に、GrailsはRESTを非常によく実行するのに十分な柔軟性と強力さを備えていますが、RESTをそのまま使用できるようにする作業はまだ完了していません。
grailsのドキュメントは、RESTful APIのセットアップについては順調に進んでいます
とにかくそれをマップすることができ、任意のURL構造を使用します。 Grails UrlMappingは非常に柔軟で、/$controller/$action
にマッピングするのはデフォルトの動作ですが、独自のマッピングを使用したり、各URLを手動でイベントマッピングしたりできます。
UrlMapping docsを参照してください- http://grails.org/doc/latest/guide/theWebLayer.html#urlmappings
uRLマッピング:
"/ api/element/$ version/$ master" {controller = "element" action = [GET: "show"]}
これにより、http getがコントローラー要素のshowメソッドにマップされます。
DRY:APIはおそらくアプリケーションと同じロジックです。違いは内容交渉です。
...
def show = {
def elements = elementService.findByMasterVersion(params.master, params.version)
withFormat {
xml {
render(status:200,text:elements as XML, contentType:"text/xml",encoding:"UTF-8")
}
json { ... }
html { ... }
}
}