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. 测试员.groovy

    class Tester {
        String name
        String vendor
    
        String toString() {
            return "$name $vendor"
        }
    }
    
  3. 验证控制器.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")

当我 PUT/POST XML 到那个 URI 时,它会在 request.XML 中正确显示,但它永远不会显示在 params 对象中。然后我意识到我在引号中有 parseRequest 布尔值。删除它解决了这个问题。

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

现在,如果您的代码确实与上面的代码相同,那么您的问题可能并不完全相同。但是,可能有帮助的是对您的 UrlMappings 进行某种更改,看看您是否可以让它以不同的方式工作。

起初我以为它可能是你的单引号,但无论我尝试过,这似乎都很好。因此,我建议将您的 URI 映射更改为其他内容,并对格式非常挑剔。最后,解决我的问题的只是 UrlMappings.groovy 文件中的一个小格式问题。

于 2012-09-20T16:20:31.187 回答
1

在尝试了几个小时解决同样的问题后,我找到了适合我的解决方案。

我的问题是我的 REST 调用中没有定义内容类型。

因此,如果您添加content-type: application/xml到休息电话中,它应该可以工作。

于 2013-07-16T07:39:06.937 回答