2010-12-08 1 views
9

Я знаю, что этот вопрос слишком широк, чтобы получить ответ с помощью простого «использования этой структуры», но я был бы очень признателен за ваш совет по этому вопросу.Как выбрать идеальный RESTful framework?

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

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

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

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

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

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

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

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

ответ

14

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

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

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

  • В его 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 Servlet или любом стандартном сервере Java Web App (Servlet). Или вы можете создать автономное серверное приложение со встроенным HTTP-сервером, таким как Jetty, - это мой предпочтительный подход. И поскольку он работает на JVM, он работает практически на любом оборудовании или ОС.

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

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

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

+0

Whoa! Это очень полный ответ! Я очень ценю время, которое ты взял, чтобы ответить мне! Я посмотрю на Restlet :) Большое спасибо! – 2010-12-08 20:34:08

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