【问题标题】:Trying to parse request body in Grape API尝试在 Grape API 中解析请求正文
【发布时间】:2015-01-14 18:10:27
【问题描述】:

所以我有一个 API,其中一个入口点看起来像:

module SomeModule
  module SomeOtherModule
    class Users < SomeModule::SomeOtherModule::Base
      helpers do
        params :user do
          requires :user, type: Hash do
            requires :device_id, type: String, desc: "Device ID"
          end
        end
      end

      desc "Some description"
      params do
        use :user
      end

      put "/", route_name: :v1_put_user_path do
        ...
      end
    end
  end
end

SomeModule::SomeOtherModule::Base 继承自 Grape::API

我的客户正在发送正文中的参数 - 看起来像:

{"user[device_id]":"xyz"}

由于这就像一个字符串,我无法识别它们。因此返回:

{"error":"user is missing"}

这意味着在我的服务器上我得到:

{"user[device_id]"=>"00999877",
  "route_info"=>
   ...

当我期待看到时:

{"user"=>{"device_id"=>"00999877"},
  "route_info"=>
  ...

关于我应该如何定义我的参数的任何想法?...或者也许有人偶然发现了这个问题并可以提供一些解决方案

【问题讨论】:

    标签: rack grape grape-api


    【解决方案1】:

    你必须像这样定义你的 params 块:

    module SomeModule
        module SomeOtherModule
            class Users < SomeModule::SomeOtherModule::Base
                params do
                    group :user, type: Hash do
                        requires :device_id, type: String, desc: "Device ID"
                    end
                end
                put "/", route_name: :v1_put_user_path do
                    ...
                end
            end
        end
    end
    

    更新

    解释解决方案...

    如果您的客户端正在发送类似于下面代码的 JSON,那么您必须定义一个组块并将类型参数定义为 Hash。当您的客户端发送像 user[device_id] 这样的“表单字段”时,同样的规则也适用。

    { user: { device_id: 1 } }
    

    更新 2

    我刚刚注意到您的客户端向您的服务发送了不正确的 JSON。这个 JSON 不应该是……

    {"user[device_id]":"xyz"} 
    

    ...因为这不是您的 API 所期望的。相反,它应该发送

    { user: { device_id: "xyz" } }.
    

    【讨论】:

    • 1.我的错!。当我发布我应该提到的问题时,我在帮助程序块 2 中定义了参数。我缺少结尾 3。用户参数被定义为哈希;)。 4. 请注意,在我的描述中,当值在正文中作为 JSON 发送时,我会遇到这个问题。当它们作为参数传递时我没有问题
    • 在这种情况下,我认为您的客户端发送的 JSON 不正确。这个 JSON 不应该是 {"user[device_id]":"xyz"} 因为它不是您的 API 所期望的。相反,他必须发送 { user: { device_id: "xyz" } }。
    • 我只是运行了一些测试,似乎我期望得到的 JSON 格式不是我实际得到的。意思是我想要得到:{“user”:{“device_id”:1231232 } } 但客户端正在生成 {"user[device_id]": "1"}。是的,你的“更新”部分很重要
    • 大声笑...刚刚写了一条评论,说出了您的原话。我宣布它关闭了!谢谢你!
    • 大声笑...我会更新我的答案并将我上面评论的内容放入其中。
    猜你喜欢
    • 1970-01-01
    • 2022-07-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-01
    • 2020-02-02
    • 1970-01-01
    • 2016-02-14
    相关资源
    最近更新 更多