2014-11-17 3 views
0

Так у меня есть API, где одна из точек входа выглядит примерно так:Попытка разобрать тело запроса в Grape 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 наследованные из винограда :: API

Мой клиент посылает Params в теле - которые выглядят как:

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

Поскольку это приходят как струны, я не в состоянии признать them.Therefore возвращение:

{"error":"user is missing"} 

Это означает, что на моем сервере я получаю:

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

Когда я ожидал увидеть:

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

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

ответ

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 

UPDATE

Объясняя решение ...

Если ваш клиент отправляет JSON как код ниже, то у вас есть для определения группового блока и определения параметра типа как Hash. Это же правило применяется, когда ваш клиент отправляет «поле формы», например user [device_id].

{ user: { device_id: 1 } } 

UPDATE 2

Я только заметил, что ваш клиент посылает неверный JSON к вашим услугам. Этот JSON не должен ...

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

... потому что это не то, что ожидает ваш API. Вместо этого следует отправить

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

1. Мое плохое !. Когда я разместил вопрос, который должен был упомянуть, у меня есть параметры, определенные в блоке помощников 2. У меня был недостающий конец 3. Параметр пользователя был определен как Hash, хотя;). 4. Обратите внимание, что в моем описании я написал, что у меня есть эта проблема, когда значения отправляются внутри тела как JSON. У меня нет проблем, когда они передаются как параметры – Daniel

+1

В этом случае, я думаю, что ваш клиент отправляет неправильный JSON. Этот JSON не должен быть {"user [device_id]": "xyz"}, потому что это не то, что ожидает ваш API. Вместо этого он должен отправить {user: {device_id: "xyz"}}. – Marlon

+0

я просто запустить некоторые тесты и кажется, что формат JSON я ожидаю получить не один я на самом деле getting.Meaning я хочу получить: { «пользователь»: { «device_id»: 1231232 } } Но клиент генерирует {"user [device_id]": "1"}.Какой да, делает точку вашего раздела «обновление» – Daniel