1

Grails 1.1.x以降、RESTリクエストのXMLおよびJSONアンマーシャリングをサポートしています。バージョン2.1.0ではこれを機能させることができないようです。機能をテストするために使用しているサンプルプロジェクトの関連ファイルは次のとおりです。

  1. UrlMappings.groovy

    static mappings = {
        "/$action/$id?"(controller:'verification',parseRequest:true)
    
        "/"(view:"/index")
        "500"(view:'/error')
    }
    
  2. Tester.groovy

    class Tester {
        String name
        String vendor
    
        String toString() {
            return "$name $vendor"
        }
    }
    
  3. VerificationController.groovy

    class VerificationController {
    
        def save() {
            Tester tester = new Tester(params.tester)
            log.error "Tester = ${tester}"
            log.error "Request XML = ${request.XML}"
        }
    }
    
  4. REST呼び出しによるXML送信

    <?xml version="1.0" encoding="utf-8"?>
    <tester>
        <name>Windows</name>
        <vendor>Microsoft</vendor>
    </tester>
    

XMLを渡すと、コントローラーのログステートメントは次のように出力します。

Tester = null null
Request XML = WindowsMicrosoft

私の戸惑いは、なぜそれがXMLとして認識されるのか(リクエストのXMLフィールドにそれを置くことによって)、それを解析せず、ここで定義されているようにパラメーターに入れるのではないかということです。

4

2 に答える 2

1

ほぼ同じ設定で、同じ問題が発生しました。あなたの問題はUrlMapping構成にあると思います。当初、私は以下を持っていました。

"/rest/airport/$iata?"(controller: "airport", action: "restHandler", parseRequest: "true")

XMLをそのURIにPUT/POSTすると、request.XMLには正しく表示されますが、paramsオブジェクトには表示されません。次に、引用符で囲まれたparseRequestブール値があることに気付きました。これを削除すると問題が修正されました。

"/rest/airport/$iata?"(controller: "airport", action: "restHandler", parseRequest: true)

さて、あなたのコードがあなたが上に持っているものと本当に同じであるならば、あなたの問題は完全に同じではないかもしれません。ただし、役立つ可能性があるのは、UrlMappingに何らかの変更を加えて、別の方法で機能させることができるかどうかを確認することです。

最初はあなたが持っていた一重引用符かもしれないと思いましたが、それは私がそれを試したどちらの方法でもうまくいくようでした。したがって、URIマッピングを別のものに変更することをお勧めします。また、フォーマットについては非常に慎重に行う必要があります。結局、私の問題を修正したのは、UrlMappings.groovyファイルの小さなフォーマットの問題でした。

于 2012-09-20T16:20:31.187 に答える
1

同じ問題で数時間試した後、私は私のための解決策を見つけました。

私の問題は、REST呼び出しでコンテンツタイプが定義されていないことでした。

したがってcontent-type: application/xml、RESTコールに追加すると、機能するはずです。

于 2013-07-16T07:39:06.937 に答える