2012-08-22 31 views
1

由於Grails 1.1.x,他們支持REST請求的XML和JSON解組。我似乎無法在版本2.1.0中得到這個工作。下面是從示例項目相關的文件,我使用來測試功能:grails xml unmarshalling

  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. XML與REST調用發送

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

當我通過在XML中,控制器日誌報表輸出這樣的:

Tester = null null 
Request XML = WindowsMicrosoft 

我的困惑是在它爲什麼將它識別爲XML (通過將它放在請求的XML字段中),但不會解析它並將其置於參數中定義here

回答

1

經過幾個小時的試驗後,我發現了一個解決方案。

我的問題是我沒有在我的REST調用中定義的內容類型。

所以,如果你添加content-type: application/xml到你的休息電話它應該工作。

1

我有同樣的問題,w幾乎完全一樣的設置。我相信你的問題可能在UrlMapping配置中。最初我有以下幾點。

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

當我把/ POST XML到URI,它會顯示正確的request.XML,但它絕不會在params對象顯示出來。然後我意識到我有引號中的parseRequest布爾值。刪除,解決了這個問題。

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

現在,如果您的代碼與上述內容完全相同,您的問題可能不完全相同。然而,有什麼可以幫助你對你的UrlMappings進行一些改變,看看你是否能以不同的方式運行它。

起初我以爲它可能是你有過的單引號,但這似乎工作正常,無論我嘗試它的方式。所以,我會建議改變你的URI映射到其他的東西,並對格式化非常挑剔。最後,這只是修復了我的問題的UrlMappings.groovy文件中的一個次要格式問題。