2013-05-03 7 views
5

私は最初のgrailsアプリケーションを構築しました。私のURLマッピングは、デフォルトのアプリケーションが提供するものです。grailsでRESTful APIを作成/管理する効率的な方法は何ですか?

static mappings = { 
    "/$controller/$action?/$id?"{ 
     constraints { 
      // apply constraints here 
     } 
    } 

    "/"(view:"/index") 
    "500"(view:'/error') 
} 

Senario

私はアクションsavelistColorControllerと呼ばれるコントローラを持っています。

def save() { 
    def colorInstance = new Color(params) 
    colorInstance.save(flush: true) 
} 

def list() { 
    [colorList: Color.list, colorTotal: Color.count()] 
} 

私はこれらのアクションのための簡単なAPIを構築したいと思います。

  • saveアクションは、パラメータをJSONとして受け入れ、レコードが保存されると正常にメッセージを提供する必要があります。
  • listアクションがJSON
  • として

質問

  • をリストを提供すべきである私は、APIのための個別のURLマッピングを行うべきでしょうか? (例:http://<domain>/<app>/rest/controller/action
  • API用に別のコントローラを作成する必要があります
  • 私は春のセキュリティプラグインを使用して認証しています。しかし、ある時点で私は安らかなAPIを認証したいかもしれません。そのための解決策は何ですか?
  • 同じコントローラを使用している場合、これらの単純なアクションをどのように変更して必要な処理を行うことができますか?

答えて

4

GrailsのRESTful WSの基本的な理解については、私の意見/回答については、このSO Questionをご覧ください。

意見:を

  • 「レコードが保存すると、アクションを保存するにはJSONなどのパラメータを受け入れ、成功のメッセージを提供しなければならない」 - 保存は、POSTのRESTfulにマッピングされます。 JSON本体をparamsにバインドする代わりに、requestにバインドされています。 JSONオブジェクトにアクセスするには、アクションメソッドでrequest.JSONを使用するだけです。

    request.JSON instanceof JSONObject

  • "listアクションはJSONとしてリストを提供すべきである" - list()アクションがGETリクエストにマップされ、あなたが

以下のようlist()にJSONとしてマップをレンダリングすることができます//コントローラのリスト()の質問に

import grails.converter.JSON 
def list() { 
    [colorList: Color.list, colorTotal: Color.count()] as JSON 
} 

回答: -

  1. api用に別のURLマッピングを作成する必要がありますか? RESTの基礎を遵守 、クライアントはリソース(この場合はColor)にアクセスしなければならないと根本的controllerまたはactionについて悩むべきではありません。サーバー側のロジックは、クライアントから抽象化する必要があります。 URLマッピングは、クライアントがリクエストの形式として使用するものです。私はColorリソースのための私のURLマッピングでこのようなものを持っています。

/color/$id?(resource: "color")

または

/color/$id?(controller: 'color'){ 
    action = [GET: "list", POST: "save"] 
} 
  • 私は私のAPIのための別のコントローラを作るべきか? - アプリケーションの設計方法によって異なります。上記のコントローラーをAPIとして使用することもできます。例えば、現在Grails APP RESTFullyに接続しているフロントエンドにAngularJSを使ったgrailsアプリに取り組んでいます。達成するために、私はAngerのAPIとして動作するRestClientControllerを持っていました。同じアプリでREST APIを使用する根拠は、将来、アプリ自体にあるAngularクライアント以外の外部クライアントに、基礎となるサービスを公開できるということです。

  • 私は認証のために春のセキュリティプラグインを使用しています。しかし、ある時点で私は安らかなAPIを認証したいかもしれません。そのための解決策は何ですか? - ここでもSpring Securityを使うことができます。私の場合はプラグインを使用していますが、プラグインの注釈付きコンポーネント@Securedを使用してcontrollerを保護しています。会社全体のLDAPとADグループと対話する承認のために、私はカスタムOAuthも有効にしています。

  • 私は同じコントローラを使用する場合、どのように私は私が必要なものを行うには、これらの単純なアクションを変更することができます。 - 私はあなたがこの質問の答えを今までに得たと思います(私が上で述べたSOの質問を通過した後)。ここで私の意見は、controlleractionsは、適切なservice要求パラメータに基づいてビジネスの実装を行うクラスにルーティングすることができます。例えば

//Action 
def show(){ 
    if(params.id){ 
     colorService.getColor() 
    } else { 
     colorService.searchColor() 
    } 
} 

上記の例では、URLマッピングは/color/123又は/colorあろう。前者の場合はcolorが、後では色が検索されます

+0

それは多くの助けになります!あなたの貴重なご意見ありがとうございます。ちなみに、grailsアプリケーションで安らかなAPIを公開しているgithubのサンプルプロジェクトは何ですか? – Anthony

+0

あなたはそのようなプロジェクトの数をgithubで見つけることができます。私は今あなたのために1つを探しました。必要に応じて[this](https://github.com/padcom/grails-json-rest-api)を参照することができます。 'JsonRestApiUrlMappings'を見てください。 – dmahapatro

関連する問題