11

Grails の公式ドキュメントによると、

スキャフォールディング プラグインのバージョン 2.0.x には、Grails 2.3 以降で導入された新しい REST API に対応するさまざまなスキャフォールディング テンプレートが含まれています。(ここから取得http://grails.org/doc/latest/guide/scaffolding.html

しかし、RESTfulness と scaffolding を連携させることはできません (または概念が理解できません)。

最初から始めましょう:

grails create-app myapp
cd myapp/
grails create-domain-class Book
grails create-scaffold-controller myapp.Book

ドメイン クラスにフィールドを追加する

class Book {
    String text

    static constraints = {
    }
}

でアプリを実行しgrails run-appます。http://localhost:8080/myapp/足場がうまく機能することを示すサーフィン:

  • http://localhost:8080/myapp/book/indexブックリストを表示するページ
  • http://localhost:8080/myapp/book/show/1ページに id = 1 の書籍の詳細が表示されます
  • http://localhost:8080/myapp/book/createページはブックを作成します
  • と力強く、古き良き足場。

REST について見てみましょう。公式ドキュメントによるとhttp://localhost:8080/myapp/books/...、REST のような URL を使用する必要がありますが、このようにアプリにアクセスしようとするcurl -i -H "Accept: application/json" localhost:8080/myapp/books/1と、大量の HTML で 404 が返されます。

では、ドキュメントを注意深く読みましょう。

Grails で RESTful API を作成する最も簡単な方法は、ドメイン クラスを REST リソースとして公開することです。これは、任意のドメイン クラスに grails.rest.Resource 変換を追加することで実行できます。

問題ありません。Book クラスの見出しは

import grails.rest.*

@Resource(uri='/books') class Book {

http://localhost:8080/myapp/現在、足場が壊れていることを示すショーをサーフィンしています。

  • http://localhost:8080/myapp/book/indexブックリストを表示するページ
  • http://localhost:8080/myapp/book/createページに xml 出力が表示されます<?xml version="1.0" encoding="UTF-8"?><book><text /></book>
  • 強制的に、悪い新しいxml出力。

URLMappings.groovyで@Resource"/books"(resources:"book")を試してみましたが、スキャフォールディングと RESTfulness を連続して機能させる実用的なソリューションは見つかりませんでした。確かに、私はそれらを別々に動作させることができました。

アップデート

望ましい目標を達成する方法を見つけました。私が見つけた方法は次のとおりです。

  1. Bookクラスを でマークし@Resource(uri = "/books")ます。
  2. 足場コントローラBookControllerを削除します。
  3. Book のスキャフォールディングを使用して専用コントローラーを作成します。class HumanBookController {static scaffold = Book}

URL を含む GUI ページのスキャフォールディングがhttp://localhost:8080/myapp/humanBook/indexうまく機能するようになりました。どちらの json リクエストも、 のような URL で適切に処理されますhttp://localhost:8080/myapp/books/1。しかし、一般的な Web と json に対して同じことを行う 2 つのコントローラーを持つことはエレガントではありません。

4

6 に答える 6

15

あなたはこれを行うことができます:

import grails.rest.RestfulController

class BookController extends RestfulController {

    static responseFormats = ['html', 'json']

    BookController() {
        super(Book)
    }
}

そして、UrlMappings.groovy で:

 "/books"(resources:"book")
 "/$controller/$action?/$id?(.${format})?"{
    constraints {
        // apply constraints here
    }
  }

ドメインに @Resource を追加する必要はありません。/books/1.json または /books/1.html で適切な場所を指すことができるようになりました。grails generate-view Bookビューを生成するには、まだ行う必要がある場合があります。ただし、html のビューを生成する必要がありますが、単一のコントローラーとパスのみを保持します。

于 2014-01-06T20:33:12.880 に答える
1

私はあなたと同じ問題を抱えていました。これは簡単な解決策であり、すべての場合に当てはまるわけではありませんが、Grails のバージョンを更新してみてください。私に関しては: Grails 2.3.4 -> Grails 2.3.6 が動作しました。誰にも役立つことを願っています。

于 2014-03-03T19:34:42.643 に答える
1

Grails 2.4.4 では、次の手順を使用して単一のコントローラーで足場を機能させることができました。

  1. UrlMappings.groovy のリソース マッピングに URL を追加しました。"/books"(resources:"book")
  2. static scaffold = true生成されたコントローラに挿入

以下が違いを生むかどうかは確認しませんでしgrails.mime.disable.accept.header.userAgents = []たが、Config.groovy でandも設定しgrails.mime.use.accept.header = trueました (後者はおそらく新しいデフォルト値です)。

スキャフォールディングされた REST インターフェイスと UI インターフェイスの両方が、次のテストで正常に動作しています。

  • GET /app//1 (Accept ヘッダーを渡す)
  • GET /app//1.json (Accept ヘッダーなし)
  • POST /app/ (json またはフォーム エンコードされたペイロードを含む)
  • /アプリ//1を削除
  • PUT /app//1 (json ペイロードを使用。フォーム ペイロードはオブジェクトを更新しましたが、302 リダイレクトを送り返しました)

編集

  1. リソース アノテーションの手順を削除し、URL マッピングの設定を明確にしました
  2. URL マッピングで割り当てられたURI は、コントローラのデフォルト URI と同じではありません。たとえば、「本」ではなく「本」などです。このマッピングを追加すると、コントローラーの URI はデフォルトで UrlMapping の URI になりますが、元の URI は引き続き機能します。
于 2014-12-25T17:02:10.503 に答える
1

私は現在 Grails 2.4.0 を使用しています。解決策は次のようにすることです。

  • コントローラー: BookController { static scaffold = true }
  • ドメイン: Book { .... } // @Resource なし

その結果、次のことが可能になります。

  • /book.json JSON化されたリストを取得する
  • /book/index を使用して HTML 標準のスキャフォールディングを取得する
  • /book/create 新しいアイテムの html 足場
  • /book/show/1 html 足場編集項目 1
  • /book/show/1.json アイテム ID の JSON: 1

私は邪悪です、私は知っています。私はこれを見つけました、そしてそれは私を動かします。

于 2014-06-01T01:57:09.580 に答える
0

必要なのは、Domain クラスの uri を含む @Resource アノテーションだけです。特定の形式が必要な場合 (デフォルトの形式が最初)、形式も含めます。

@Resource(uri='/books', formats=['json', 'xml'])

それだけです。ypu がまだ動的 @Resource エンドポイントを見つけるのに問題がある場合は、次を実行してみてください。

grails url-mappings-report

これにより、@Resource ドメインの scaffolded コントローラーによってサポートされているものを含む、すべての URL の優れた要約が得られます。私は、URL を「推測」しようとすると、ばかげた間違いを犯しがちであることがわかりました。レポート出力を使用すると、あなたと grails が一致することが保証されます。

于 2015-02-25T23:08:52.750 に答える
0

生成されたコントローラーは、次のようなリクエストを認識するアクションを実装するため、Restful コントローラーです。

curl -i -X GET yourDomain:8080/yourApp/books.json

本のリストをjson形式で返します。(テストデータを作成したとして10冊ですね?)

次のようなパラメーターを追加できます。

curl -i -X GET yourDomain:8080/yourApp/books.xml?40

デフォルトでは、htmlフォーマットを取得します。正しいデータを追加.jsonまたは取得する必要があります。.xml

Acceptヘッダーも使用できます

curl -i -X GET -H "Accept: application/xml" yourDomain/books/1

id=1 の書籍の詳細を xml 形式で返します。ついに

curl -i -X POST -H "Content-Type: application/json" -d "{name: 'Book'}" yourDomain/books

新しいブックを作成し、

curl -i -X PUT -H "Content-Type: application/json" -d "{name: 'Book'}" yourDomain/books/1

id=1 の本の名前を更新します

すべてのリソースは、URL を介して公開する必要があります。UrlMappingsURL は生成されません。ファイルに書き込む必要があります。

"/v1/books"(resources: "book")

最初の文字列"/v1/books"は uri で、2 番目の文字列"book"は grails 規則に従ったコントローラー名です。(前のv1文字列は、常に API URI にバージョン番号を付けているためです)

 | GET    | /v1/books            | Action: index  |
 | GET    | /v1/books/create     | Action: create |
 | POST   | /v1/books            | Action: save   |
 | GET    | /v1/books/${id}      | Action: show   |
 | GET    | /v1/books/${id}/edit | Action: edit   |
 | PUT    | /v1/books/${id}      | Action: update |
 | DELETE | /v1/books/${id}      | Action: delete |
于 2013-11-25T19:56:24.387 に答える