2

Grails 2.1.1 では次のアクションを考慮します。

class ActionController {

    static allowedMethods = [submit: 'POST']

    def submit() {            
        render([ok: true, data: request.JSON] as JSON)
    }
}

次のコマンド:

curl -X POST http://localhost:8080/backoffice/action/submit \ 
            -H 'Content-Type: application/json' \
            -d '{"foo":"bar"}'

戻り値

{"ok" : true, "data" : {"foo" : "bar"}}

しかし、 jsonに という要素がある場合action、Grails はその要素の値に等しい名前のアクションを見つけようとします。

例えば ​​:

curl -X POST http://localhost:8080/backoffice/action/submit \ 
            -H 'Content-Type: application/json' \
            -d '{"foo":"bar","action":"bar"}'

grails が uri を見つけようとしているため、404 エラーが発生/action/bar.dispatchします!!

この奇妙な機能を無効にするにはどうすればよいですか?

私のUrlMappings.groovy

 static mappings = {
    "/$controller/$action?/$id?"(parseRequest: true){
        constraints {
            // apply constraints here
        }
    }

この動作は が原因parseRequest=trueですか? このパラメーターを使用して、json から CommandObject を使用できるようにします。

4

2 に答える 2

1

たぶんあなたは特定のマッピングを試すことができるので、Grailsはパラメータでアクション名を検索しようとはしません。このような:

static mappings = {
    "/action/submit"(controller: 'action', action: 'submit', parseRequest: true)
    "/$controller/$action?/$id?"(parseRequest: true)
}

UrlMappingsは特定のルールから一般的なルールまで機能するため、最初のルールを優先する必要があります。

于 2012-11-12T11:28:22.563 に答える
1

問題はparseRequest:true、投稿された JSON を解析し、その値を に追加する ですparams。JSON に含まれている場合、actionこれが設定されparams.action、実行されるコントローラー アクションに影響します。

http://jira.grails.orgにJIRA レポートを送信して、parseRequest から特定のパラメーターを除外する何らかのメカニズムを要求するか、UrlMappings 時に URL から抽出されたパラメーターがそれらをオーバーライドするように優先順位を変更することをお勧めします。その逆ではなく、JSON で提供されます。

于 2012-11-12T11:08:30.677 に答える