Правильное формирование запросов API - PullRequest
0 голосов
/ 16 июня 2020

Следующая команда в консоли:

curl 'https://3b803ce956aa.ngrok.io/api/v1/send' -i --header "Accept: application/json" --header "Content-Type: application/json"  -H 'Accept-Charset: utf-8' -H 'Authorization: Token token="GeUPm5xoxQFXR0ijJOZ6W6xr2ME1wZUWiaB3PLg9uZ8uGhFFDE7YnqCjFQwcCs0zgbtHjIiuc2jxo4I5"' -d '{"server_id":1,"building_id":1}'

, но также с версией

--data '{"server_id":1,"building_id":1}'

, принимается контроллером API. Маршруты определены как:

namespace  :api  do
  namespace  :v1 do
    post 'send', to: 'messages#send', defaults: { format: :json }

Однако в обоих случаях обработка запросов не выполняется, поскольку он получает и возвращает:

Processing by Api::V1::MessagesController#send as JSON
  Parameters: {"server_id"=>1, "building_id"=>1, "message"=>{"server_id"=>1, "building_id"=>1}}
Completed 500 Internal Server Error in 0ms (ActiveRecord: 0.0ms)
ArgumentError (wrong number of arguments (given 1, expected 0)):

где действие контроллера

def send
  @request = JSON.parse(request.body.read)
  @messagelog = Messagelog.create(server_id: params[:server_id], building_id: params[:building_id]
  [...]

Появляются две странности:

  1. тот факт, что параметры повторяются с содержимым параметров как часть сообщения
  2. действие ожидает 0 аргументов I не понимаю, почему параметры интерпретируются дважды (это подвопрос ..). Как можно сконструировать действие контроллера API для принятия параметров?

1 Ответ

0 голосов
/ 16 июня 2020

По умолчанию Rails оборачивает JSON параметры запроса в sh, угадывая его имя из класса контроллера. Вы можете прочитать подробности здесь .

Так что, если вам не нужен этот «угаданный» ха sh в вашем params, просто удалите :json из :format массива в config\initializers\wrap_parameters.rb. Или вы можете использовать детальное управление на уровне контроллера, как описано выше.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...