7

いくつかのリソースを公開するgrailsWebアプリケーションがあるとしましょう。

  • タグ
  • URL
  • ユーザー

このアプリケーションには、ユーザーが操作する従来のWebインターフェイスといくつかの管理機能があります。RESTful APIを介してアプリケーションからクライアントにリソースを公開したいのですが、アプリのその部分が既存のコントローラーとコードを乱雑にしたくないのです。そこで、次のことを思いつきました。

Webインターフェースが提供host/app_path/url/[list|show|create]する場合は、RESTAPIをに設定する必要があります/host/app_path/rest/url

そのため、次のUrlMappingsファイルが作成されました。

class UrlMappings {
static mappings = {
    "/$controller/$action?/$id?"{

    }

    /* adding new urls and listing them */
    "/rest/url"{
        controller = "urlRest"
        action = [POST: "save", PUT: "save", GET: "list", DELETE:"error"]
    }

    /* accessing a single url */
    "/rest/url/$id"{
        controller = "urlRest"
        action = [POST: "update", PUT: "update", GET: "show", DELETE: "delete"]
    }

    /* non-crud stuff on urls */
    "/rest/url/$action?/$id?"{
        controller = "urlRest"
    }

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

問題は、これがここで最も乾燥したものではないということです。タグなどのリソースを追加すると、さらに悪化します。それらは、非常に類似したコードのさらに別の3つのブロックに変換されます...

非クラッド関数は、特定の基準で検索するようなものになります...

ループを使用してマッピングクロージャを生成しようとしましたが、成功しませんでした。私たちはここで完全に間違った方向に進んでいますか?

4

1 に答える 1

7

次のマッピングをお勧めします。

"/rest/url/$id?"(resource:"urlRest")

以下は、これがurlRestControllerに対して作成するHTTPメソッドからアクションへのマッピングです。

GET         show
PUT         update
POST        save
DELETE      delete

/ rest / url POSTをマップして保存し、/ rest / url / id PUTを更新する理由がわかりますが、それはこれらの動詞の意味に反します。PUTは、新しいURLを追加する唯一の方法であり、POSTはURLを更新する唯一の方法です。あなたがレイアウトした方法でそれを行うことはうまくいくでしょう、そしてあなたの制約があなたの現在のコントローラーコードに手を触れないようにすることであるならば、それは最良の方法かもしれません。ただし、私の推測では、コントローラーはデフォルトのマッピングを適切に処理するようにすでにコーディングされている可能性があります(IDがない場合は更新/削除でエラーが発生し、IDがない場合はリストへのリダイレクトを表示するなど)。

于 2009-06-27T02:13:46.233 に答える