Ajax звонки из браузера через асинхронный контроллер - PullRequest
2 голосов
/ 19 января 2011

Я вызываю внешнюю службу REST (API REST Vimeo).Ответ службы - объект JSON.Один просмотр в моем приложении может в конечном итоге сделать несколько вызовов в службу (для загрузки нескольких видео).

Я хотел оценить плюсы и минусы использования следующей архитектуры в этой ситуации

  1. использование вызовов jquery ajax для загрузки отдельных видео (вызов, сделанный в службу REST из браузера, поскольку у каждого видео есть свой Id, единственное, что требуется для получения подробностей)
  2. использование действия асинхронного контроллеравызов REST в контроллере с последующим отображением vedios

Примечание: я использую простые сервисы API, которые не требуют аутентификации.

Ответы [ 3 ]

3 голосов
/ 10 февраля 2011

AsyncController не был предназначен для асинхронного обслуживания HTTP-запросов, но для выполнения длительных процессов на стороне сервера.Создание одного запроса к службе REST может быть или не быть длительным процессом на стороне сервера.

Итак, независимо от того, решите ли вы сделать запрос REST на стороне сервера или напрямую от клиента (браузера), вам не обязательно использовать AsyncController.Обычный Controller может выполнить эту работу.

Способ обработки видео-запросов зависит от структуры вашего бизнес-уровня.Если есть знания о видео Vimeo для обработки на бизнес-уровне, то лучше сделать так, чтобы ваш веб-сервис вызывал сервисную сторону.В противном случае у вас будет бизнес-логика на клиенте, что может затруднить обслуживание.

Если, с другой стороны, ваши видео Vimeo являются только частью автономного UI-виджета, то безопасно обрабатывать запрос полностью на клиенте без непредвиденных последствий.

Я предполагаю, что вызов веб-службы Vimeo получает файл Flash или что-то в этом роде.Для выполнения вызовов службы Vimeo с сервера потребуется больше пропускной способности, а также больше памяти, поскольку тогда данные должны отправляться на ваш сервер.

Если вы выполняете это на стороне сервера, это происходит:

 1 - Browser sends HTTP-Request to YourApplication
 2 - YourApplication sends HTTP-Request to Vimeo's WebService
 3 - Vimeo's WebService sends big HTTP Response with the Video data to YourApplication
 4 - YourApplication sends big HTTP Response with the Video data to Browser

 * If you choose to do it this way, this might be the point at which it makes sense to use an AsyncController

Если вы делаете это на стороне клиента, это происходит:

 1 - Browser sends HTTP-Request to Vimeo's WebService
 2 - Vimeo's WebService sends big HTTP Response with the Video data to the Browser

Похоже, что делать все на стороне клиента лучше.Но тогда возникает проблема бизнес-логики.Это можно исправить, отправив запрос ajax синхронному действию контроллера для обработки бизнес-логики и попросив браузер вернуть URL-адрес вызова службе REST.Итак:

 1 - Browser sends AJAX request to YourApplication
 2 - YourApplication handles business logic and sends the URL of the REST request to Browser
 3 - Browser sends AJAX request to Vimeo's WebService
 4 - Vimeo's WebService sends big HTTP response with the video data to the browser.

Я думаю, что это, вероятно, ваш лучший выбор.

0 голосов
/ 03 февраля 2011

Если вы совершаете несколько вызовов службы REST Vimeo для одного метода действия, это может показаться хорошим кандидатом на использование асинхронного контроллера. Это будет иметь два преимущества: это позволит вам выполнять несколько вызовов к службе Vimeo параллельно и освободит поток, который обрабатывает запрос, и позволит ему обрабатывать другие запросы, пока сервер ожидает ответа от Vimeo.

Я полагаю, что компромисс здесь добавляет сложности к вашему клиентскому коду или к вашему контроллеру. Еще одно преимущество выполнения запросов на стороне сервера (независимо от того, выполняете ли вы их асинхронно или нет), заключается в том, что вы можете потенциально кэшировать данные и минимизировать количество дорогостоящих вызовов веб-служб, которые вам придется выполнять для обработки запросов в будущем. Это действительно зависит от того, является ли кэширование данных приемлемым вариантом в вашей ситуации.

0 голосов
/ 19 января 2011

У вас могут быть проблемы с первым методом, поскольку междоменные вызовы ajax (открытая страница поступает из домена yoursite.com, а вы звоните на vimeo.com) запрещены браузерами.* В дополнение ко второму способу вы можете использовать JSONP, предоставляемый Vimeo API: http://vimeo.com/api/docs/response-formats

...