【问题标题】:Posting JSON with curl to Grails JSON REST API plugin使用 curl 将 JSON 发布到 Grails JSON REST API 插件
【发布时间】:2011-08-16 15:07:21
【问题描述】:

我有一个在 1.3.7 上运行的 Grails 应用程序,安装了 json-rest-api 插件版本 1.0.8。我正在尝试使用 curl 从命令行发布数据以创建域类的新实例,但似乎无法找出格式化 JSON 以使解析器满意的正确方法。我也找不到任何可以最终描述数据应该如何格式化的文档。

领域类是这样定义的:

package foo

class Foo {
  static expose = 'foo'

  String name

  static constraints = {
    name(inList: ['xyzzy', 'quux'])
  }
}

鉴于上述情况,这是行不通的:

$ curl -X POST --header "Content-Type: application/json" --data-urlencode '{"name":"xyzzy"}' http://myapp/api/foo

应用返回500错误码,回复内容为

{"success":false,"message":"Property [name] of class [class foo.Foo] cannot be null"}

API 希望我发送什么样的数据?

【问题讨论】:

    标签: json grails


    【解决方案1】:

    试试下面的格式:

    { data: { name: "Blabla" } }
    

    【讨论】:

    • ExtJS'es JsonStore 发送的格式总能偷看。此插件旨在与此客户完全兼容。
    • 感谢马蒂亚斯,你让我走上了正轨!我以为我已经尝试了每一个组合,但是这样做了,结合删除 curl 的 URL 编码并仅使用 --data "..." 发送 JSON。
    【解决方案2】:

    这并不特定于 json-rest API。我只使用过 Grails 的内置 RESTful 功能。

    您需要您的 URL 映射,以便 parseRequest = true。您必须在 JSON 中包含该类:

    {"class":"Foo", "name":"blabla"}
    

    在你的控制器中,你这样做......

    def fooInstance = new Foo(params['foo'])
    

    还有你的金子。

    【讨论】:

    • 感谢您的信息。然而,我的问题似乎是特定于这个特定插件的,因为 mappings are automatically provided by the plugin.奇怪的是它没有指定parseRequest=true。看起来它应该以某种方式起作用,所以也许这毕竟不是根本原因?
    • 您从 Grails 未提供的插件中得到了什么?
    • 好问题。我无法告诉你,因为我没有编写应用程序,我只是想使用它。阅读short plugin description,我应该得到的是接近零配置的POST来创建功能。如果我能做到这一点,我可以花一两个小时撕掉插件并使用另一种方法,如果我得到一些好的指示:)
    • 好吧,看一眼插件,它看起来像是在执行自动 URL 映射(这很有趣,因为对于我们的项目,我们还使用了 /api/whatever)和来自域的自动 JSON 渲染。该插件的缺点是您似乎无法对返回的数据进行太多控制。我不喜欢发送带有无用数据的有效载荷。所以我喜欢完全控制呈现给客户端的内容。
    • 因此,如果您愿意创建自己的 URL 映射并呈现自己的 JSON,那么我看不出有什么不同。但要持保留态度。我对您的项目的了解为零,我不想让您走上错误的道路。在你相信我的话之前,先研究一下 Grails 提供的开箱即用的功能。
    猜你喜欢
    • 2013-09-09
    • 2023-03-26
    • 2019-06-03
    • 2015-10-14
    • 2019-07-25
    • 1970-01-01
    • 2016-02-10
    • 1970-01-01
    • 2022-10-18
    相关资源
    最近更新 更多