试图在Grape API中解析请求体

时间:2014-11-17 18:25:44

标签: rack grape grape-api

所以我有一个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"=>
  ...

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

1 个答案:

答案 0 :(得分:0)

你必须像这样定义你的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。当您的客户发送&#34;表单字段时,同样的规则也适用。比如user [device_id]。

{ user: { device_id: 1 } }

更新2

我刚注意到您的客户端向您的服务发送了错误的JSON。这个JSON不应该......

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

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

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