web-dev-qa-db-ja.com

REST APIをGrailsアプリに実装する

GrailsアプリにWebサービスで使用できるRESTful API(主にCRUDアクション)を提供するための最良のアプローチは何だろうと思っていました、例えばブラウザベースのアプリやその他のものに対応するiOSアプリを構築する場合。

私は、Service Layerを再利用できるように、www.mywebapp.com/api/someActionからの呼び出しを受け取るGrailsアプリケーションに別のパーツを作成することを考えました。では、どのようにしてURLマッピングを行うのでしょうか。大きなApiControllerが1つしかない場合は、あまりグルーヴィーに聞こえません。

または、私が知らなかったより良いアプローチはありますか?このアプローチmustは、OAuthのようなものをサポートして、Webサービスを呼び出しているユーザーを認証します。

27

GrailsはdefinitelyでREST APIを提供できますが、そうすることの難しさのレベルは mature (aka。how RESTful)APIになりたい。

基本的なREST

HTTP動詞の全範囲を使用してリソースのjsonまたはxml表現を操作し、HTTP応答コードを活用するというRESTfulnessの基本レベルを取得することは、非常に簡単です。それを実現するための3つの主要な要素があります。

  1. URLマッピング

    以下は、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+/
        }
    }
    
  2. コンテンツ交渉

    Grailsがコンテンツネゴシエーションを処理できる3つの異なる方法により、フレームワークは非常に柔軟になり、Accept HTTPヘッダーなどを設定できない可能性のあるはるかに幅広いクライアントをサポートできます。

    コンテンツネゴシエーションを使用して、クライアントが希望するものに基づいて withFormat ブロックを使用して、さまざまな方法でさまざまな要求に応答できます。この強力な機能は、 Githubが行う方法 のように、APIのバージョン管理にも使用できます。

  3. 応答ステータス

    HTTPにはすでに、優れた応答メカニズムが組み込まれており、キャッシュ機能やべき等演算など、アーキテクチャの固有の機能を活用できます。一部のWebブラウザーは特定の応答コードを適切に処理しませんが、APIを使用するクライアントアプリケーションはそれらを使用して内部コードを大幅に簡略化できます。

ドライレスト

CRUDは基本的にすべてのドメインオブジェクトで同じであるため、アプリケーションをRESTfulにし、同時にDRYに保つための最良の方法の1つは、コントローラーのスキャフォールディングをできるだけ活用することです。 この記事 デフォルトコントローラーをよりRESTfulにする方法、および この記事 デフォルトコントローラーを簡略化する方法は、どちらもスキャフォールディングからより多くのパワーを得るのに優れたリソースです。

高度なREST

その時点で、Grailsアプリケーション用のかなり機能的なREST APIができました。基本的なCRUD操作はすべて実行でき、リソースの操作はかなり簡単です。

しかし、真のRESTfulハイパーメディアAPIへのはしごの次のレベルはmuch達成が困難です。これを修正することはGrailsのロードマップにありますが、現在はかなり苦痛です。これらの部分は次のとおりです。

  1. ハイパーメディアリソース
  2. コンテンツタイプ
  3. バージョン管理

ありがたいことに、カスタムマーシャラーの定義を非常に簡単にする プラグイン があり、RESTパズルの残りの3つのピースをかなり簡単にカバーできます。

最後に、全体を保護する側面があります。一般に、 Spring Security は、APIへのユーザーアクセスを保護する限り、適切に保持します。ほとんどのAPIアクセスはアプリケーションからであり、ユーザーには表示されないため、通常、基本認証またはダイジェスト認証が最も簡単な方法です。ありisOAuthプラグイン これはSpring Securityに基づいて構築されています。個人的には使っていないので安定性は保証できませんが、なかなか良さそうです。

一般に、GrailsはRESTを非常によく実行するのに十分な柔軟性と強力さを備えていますが、RESTをそのまま使用できるようにする作業はまだ完了していません。

58
cdeszaq

grailsのドキュメントは、RESTful APIのセットアップについては順調に進んでいます

http://grails.org/doc/latest/guide/webServices.html#13.1

6
nate_weldon

とにかくそれをマップすることができ、任意のURL構造を使用します。 Grails UrlMappingは非常に柔軟で、/$controller/$actionにマッピングするのはデフォルトの動作ですが、独自のマッピングを使用したり、各URLを手動でイベントマッピングしたりできます。

UrlMapping docsを参照してください- http://grails.org/doc/latest/guide/theWebLayer.html#urlmappings

1
Igor Artamonov
  • uRLマッピング:

    "/ api/element/$ version/$ master" {controller = "element" action = [GET: "show"]}

これにより、http getがコントローラー要素のshowメソッドにマップされます。

  • つまり、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 { ... }
    }
}
  • Oauthの実装はかなり複雑で、多くの状況で過剰に見えます。
1
moskiteau