2013-05-03 61 views
5

我已經構建了我的第一個Grails應用程序。我的URL映射是什麼的默認應用程序提供:用grails創建/管理RESTful API的有效方法是什麼?

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

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

塞納里奧

我有一個名爲ColorController用行動savelist控制器。它只是做這樣的事情:

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

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

我想爲這些行動建立一個簡單的API。

  • 保存操作應接受JSON參數,並在記錄保存時提供成功的消息。
  • 名單行動應提供列表作爲JSON

問題

  • 我應該爲API一個單獨的URL映射? (例如http://<domain>/<app>/rest/controller/action
  • 我應該做一個單獨的控制器,用於驗證我的API的
  • 我使用彈簧安全插件。但是在某些時候,我可能也想要認證restful api。有什麼解決方案?
  • 如果我使用相同的控制器,我如何修改這些簡單的操作來完成我所需要的操作。

回答

4

在甚至在下面查看我的意見/答案之前,我建議訪問此SO Question以瞭解Grails中對RESTful WS的基本理解。

意見:

  • 「保存操作應該接受參數,JSON,並提供一個成功的消息,如果記錄保存」 - 保存映射到POST REST風格。而不是將JSON正文綁定到params,而是綁定到request。爲了訪問JSON對象,您只需在操作方法中使用request.JSON

    request.JSON instanceof JSONObject

  • 「名單行動應提供的列表作爲JSON」 - list()動作映射到一個GET請求,您可以呈現地圖的JSON在list()如下

//控制列表()

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

問題的答案: -

  1. 我應該爲api製作一個單獨的URL映射嗎? 遵守REST的基本知識,客戶端應該只能訪問資源(在這種情況下爲Color),不應該爲基礎的controlleraction打擾。服務器端邏輯應該從客戶端抽象出來。 URL映射是客戶將用來作爲請求的形式。我想在Color資源的url映射中使用類似這樣的內容。

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

/color/$id?(controller: 'color'){ 
    action = [GET: "list", POST: "save"] 
} 
  • 我應該讓我的API的一個單獨的控制器? - 取決於應用程序的設計方式。您也可以將上述控制器作爲API。例如,目前我正在使用Grails應用程序,該應用程序在連接到Grails APP RESTFully的前端使用AngularJS。爲了實現我有一個RestClientController作爲一個API的Angular。在同一個應用中使用REST api的原理是,將來我們可以將底層服務暴露給除應用本身中存在的Angular客戶端以外的其他客戶端。

  • 我使用spring security插件進行身份驗證。但是在某些時候,我可能也想要認證restful api。有什麼解決方案? - 你也可以在這裏使用Spring Security。在我的情況下,我使用插件,並通過使用插件的註釋組件@Secured來保護controller。我還爲定製的OAuth啓用了與公司範圍的LDAP和AD羣組交互的授權。

  • 如果我使用相同的控制器,如何修改這些簡單的操作來完成我所需要的操作。 - 我想你現在已經得到了這個問題的答案(在通過上面提到的SO問題之後)。這裏是我的意見,controlleractions可以路由到合適的service類,基於請求參數做業務實現。

例如,

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

在上面的例子中,URL映射將是/color/123/color。在前一種情況下,它將得到color,並在稍後它將搜索顏色

+0

這有助於很多!感謝您的寶貴意見。作爲一個方面說明,你有沒有遇到github上的任何示例項目,暴露在grails應用程序的restful api? – Anthony 2013-05-03 16:31:33

+0

你會在github中找到這樣的項目的數量。我現在爲你搜索了一個。如果你願意,你可以參考[this](https://github.com/padcom/grails-json-rest-api)。看看'JsonRestApiUrlMappings'。 – dmahapatro 2013-05-03 17:38:35

相關問題