Как выбрать идеальный каркас RESTful? - PullRequest
9 голосов
/ 08 декабря 2010

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

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

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

Для Python и Java я думал о создании выделенного пакета. Каждое действие будет вызывать выделенный метод в пакете, пакет будет возвращать объект / dict, и действие преобразует его в соответствующий формат.

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

  1. Играть! Framework (Java)
    • Плюсы :
      • Маршрутизатор ориентирован на RESTFul (вы определяете метод (GET, POST и т. Д.), Запрос и класс.метод для использования)
      • Вам не нужно делать один урок за действие
    • Минусы :
      • Модель уже включена. Если я позже изменю фреймворк, возможно, я застряну с ним (но, видимо, нет, поскольку Play!, Похоже, использует JPA)
      • Возможно, тот факт, что если я хочу отправить параметры действию, которое будет определено в сигнатуре метода, я должен принять свойства ClassName.properties вместо json, как {ClassName: {properties: 'value'}}
  2. Tornado Web (Python)
    • Плюсы :
      • Кажется очень мощным: используется FriendFeed (по крайней мере)!
      • Аутентификация через основные OpenId, OAuth и Facebook уже реализована
      • Очень легкий (может быть проблема)
    • Минусы :
      • Не так популярно: вы лучше разбираетесь в работе, переходя к коду, чем документ
      • URL-адреса кажутся очень простыми (насколько я видел, вам нужно определить все URL-адреса в одном файле, включая весь класс)
      • Один класс за действие (может быть тяжелым)
      • Должны быть сделаны декораторы для базовых (тестирование, если пользователь аутентифицирован и т. Д.)

Для их использования в производстве это было бы легко сделать с помощью apache & mod_proxy или nginx.

Итак, мои вопросы довольно просты: что бы вы выбрали (между этими двумя или другими, я не закрыт для предложений) и почему?

Большое спасибо за совет!

1 Ответ

14 голосов
/ 08 декабря 2010

Моя любимая среда разработки RESTful Web App - Restlet .Это фреймворк / библиотека Java (его можно рассматривать как любой из них), но он хорошо работает с Jython и JRuby , поэтому, если вы предпочитаете эти языки, вы все равно можете использовать его.Я в основном использую его с Groovy .

Я предпочитаю Restlet, потому что:

  • Его API полностью охватывает и выравнивает парадигмы RESTful, поэтому он поощряет васработать ОТДЕЛЬНО.Например, когда Router направляет запрос к ServerResource, он создает новый экземпляр ServerResource для каждого запроса.Это поощряет реализацию быть без гражданства.И есть богатая иерархия классов со всеми концепциями, необходимыми для реализации веб-приложения RESTful: клиент, сервер, протокол, VirtualHost, запрос, ответ, MediaType, статус и т. Д.

  • его APIвключает в себя классы для написания как серверов, так и клиентов, и они очень последовательны и почти симметричны.Например, есть класс ServerResource и класс ClientResource.ServerResource.get() и ClientResource.get() оба возвращают Representation.Единственное отличие состоит в том, что вы реализуете ServerResource.get() и генерируете представление ответа, в то время как вы вызываете ClientResource.get() и получаете представление ответа.

  • API соответствует соглашениям Java.Например, если запрос, сделанный с помощью ClientResource.get(), получит ответ об ошибке, такой как 401, будет выдано ResourceException.И если вы реализуете ServerResource и хотите вернуть статус ошибки, вы просто выбрасываете ResourceException (это RuntimeException, что приятно).

  • Благодаря своему механизму расширения, он очень хорошо работает с широким спектром лучших библиотек Java.Расширения включены для различных клиентских и серверных библиотек HTTP, баз данных, библиотек шаблонов, библиотек безопасности, библиотек данных, таких как XML, JSON, OAuth, OData и т. Д., И даже для OSGI.

  • Развертывание очень гибкое.Вы можете встроить API на основе Restlet в существующее приложение Java, существующее приложение сервлета Java или любой стандартный сервер Java Web App (сервлет).Или вы можете создать автономное серверное приложение со встроенным HTTP-сервером, таким как Jetty - это мой предпочтительный подход.И поскольку он работает на JVM, он работает практически на любом оборудовании или ОС.

  • Он зрелый, надежный, ответственно обслуживается, постоянно совершенствуется и хорошо поддерживается как сообществом, так и коммерчески.

  • Это открытый исходный код, с очень четким и хорошо структурированным кодом.Разработчики рады принять любой вклад.Я отправил несколько патчей, и они были быстро прикреплены к стволу без драмы.

Другими вариантами, которые я бы предложил, были бы микрофрейм Python Бутылка иРубиновая микрорамка Синатра .Они простые, понятные, легкие и эффективные.А поскольку они работают со стеками WSGI и Rack, существует богатый набор модулей промежуточного программного обеспечения, которые можно легко использовать с ними.

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