Попытка разобрать тело запроса в 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"=>
  ...

Любые идеи о том, как мне определить свои параметры?... или, может быть, кто-то наткнулся на эту проблему и может предложить какое-то решение


person Daniel    schedule 17.11.2014    source источник


Ответы (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" } }.
person Marlon    schedule 17.11.2014
comment
1. Мой плохой!. Когда я разместил вопрос, я должен был упомянуть, что у меня есть параметры, определенные в вспомогательном блоке 2. У меня был отсутствующий конец 3. Однако пользовательский параметр был определен как хэш;). 4. Обратите внимание, что в моем описании я написал, что у меня возникает эта проблема, когда значения отправляются внутри тела в виде JSON. У меня нет проблем, когда они передаются как параметры - person Daniel; 17.11.2014
comment
В этом случае я думаю, что ваш клиент отправляет неправильный JSON. Этот JSON не должен быть {user[device_id]:xyz}, потому что это не то, что ожидает ваш API. Вместо этого он должен отправить {user: {device_id: xyz}}. - person Marlon; 17.11.2014
comment
Я просто запускаю несколько тестов и кажется, что формат JSON, который я ожидаю получить, не тот, который я на самом деле получаю. Это означает, что я хочу получить: {user: {device_id: 1231232 } }, но клиент генерирует {user[device_id] : 1}. Что да, делает смысл вашего раздела «обновления» - person Daniel; 17.11.2014
comment
лол ... только что написал комментарий, говоря ваши точные слова. Я объявил его закрытым! Спасибо, чувак! - person Daniel; 17.11.2014
comment
лол ... Я обновлю свой ответ и добавлю в него то, что прокомментировал выше. - person Marlon; 17.11.2014