2013-08-21 5 views
0

Мы работаем над проектом RoR, реализующим LMS. Нам необходимо отправить данные во внешнюю службу REST, предоставляемую внешним сервером. Данные отправляются при выполнении определенных событий, возможно, что некоторые из них не запускаются клиентом (клики и т. Д.).Связь RESTful API от Ruby on Rails (4.0)

Кроме того, нам необходимо сохранять согласованность в наших моделях рельсов, поскольку нам необходимо вести учет действий пользователя.

Существует библиотека, предоставляемая для работы с API, написанная на JavaScript. Это облегчает большую часть работы, поэтому мы хотели бы использовать вместо создания собственной реализации для запросов API.

В чем разница между каждым из следующих подходов? Будет ли предпочтительнее другого?

  1. Используйте JavaScripts для передачи данных, вставляя фрагменты в взглядов, от клиента, но с клиентом выполнить это может иметь серьезные последствия (оценки изменились, ложный успех, и т.д.).

  2. Используйте сервер NodeJS для выполнения Javascript, но мы не знаем, как общаться с нашим основным сервером (Rails)

  3. И, наконец, использовать клиент HTTP из рельсов приложения для отправки запросов к услуге. Однако мы точно не знаем, как это сделать, также возникает вопрос, где этот код входит в шаблон MVC.

ответ

0

Вариант № 1, как вы, вероятно, поняли, не может быть и речи. Чтобы клиент мог совершать вызовы API от вашего имени, вам нужно будет отправить им свой секретный ключ/токен/все, что вам нужно для аутентификации с помощью API. Но как только у них это получится, они могут просто использовать консоль сценария, чтобы делать любые вызовы API, которые они хотят «как вы». Это было бы катастрофой.

Вариант №2 может быть непомерно сложным - я лично не уверен, как вы это сделаете. Возможно, используя библиотеку, такую ​​как therubyracer, выполнить код JavaScript из кода Ruby, но есть определенная степень песочницы, и это может сломать код, требующий доступа к сети.

Это дает вам вариант №3, написание собственной библиотеки Ruby для взаимодействия с API. Это может быть легко или затруднительно, в зависимости от того, насколько волосатый API-интерфейс, но у вас уже есть версия JavaScript (и, надеюсь, документы для самой службы REST), поэтому в сочетании с чем-то вроде RestClient или HTTParty путь вперед должен быть ясным.

Что касается того, где вызовы API будут соответствовать вашему Rails-коду: если у вас есть модели, которые в основном зеркалируют ресурсы, с которыми вы взаимодействуете через службу REST, может иметь смысл добавить соответствующие вызовы API как методы или обратные вызовы по этим моделям. В противном случае было бы неплохо включить их в соответствующие действия контроллера, но следите за сложностью кода и извлекайте его в отдельный класс или модуль, если все становится некрасиво.

(В тех случаях, когда вам не нужно ждать ответа от API перед отправкой что-то обратно пользователю, вы можете использовать DelayedJob или аналогичные очереди ваших API вызовов в фоновом режиме.)

Смежные вопросы