Какая хорошая технология веб-сервисов REST с открытым исходным кодом?
Я ищу альтернативу awesome возможностей .NET(WCF) REST.
Почему?
У меня есть глубокий интерес к технологии с открытым исходным кодом, но когда дело доходит до веб-сервисов, у меня нет опыта, кроме веб-сервисов .NET.
Кроме того, в настоящее время я использую много Java и Python, и я ухожу от стека технологий Microsoft.
Пожалуйста, предложите альтернативы на любом языке программирования, но объясните, почему это хорошо или лучше по некоторым причинам. (эта причина может быть тесно связана с выбором языка)
Что я хочу знать?
- Простота использования
- Установка
- Конфигурация
- Возможности генерации
- Интеграция с IDE
- Развертывание
- Кривая обучения
- Плюсы и минусы
- и др.
Ответы
Ответ 1
Spring 3.0 REST:
Spring использует контроллеры на основе аннотаций, которые могут использоваться для привязки URL-адреса к методу в контроллере. Аннотации используются для различения методов GET и методов POST.
@RequestMapping(value="/hotels/{hotel}/bookings/{booking}",
method=RequestMethod.GET)
public String getBooking(@PathVariable("hotel") long hotelId,
@PathVariable("booking") long bookingId, Model model) {
Hotel hotel = hotelService.getHotel(hotelId);
Booking booking = hotel.getBooking(bookingId);
model.addAttribute("booking", booking);
return "booking";
}
Под капотом переменная "гостиница" в строке URI преобразуется в длинный список параметров, как и резервирование. Spring REST также может объединять объекты JSON в пользовательские классы, используя эту же технику. Обратите внимание, что этот метод аннотируется как RequestMethod.GET
, что означает, что он вызывается для запросов GET, но не POST-запросов.
Spring 3.0 REST упрощает создание веб-сервисов RESTful, устраняя необходимость изобретать колесо или маршал /unmarshal текст JSON вручную с/на объекты Java.
В блоге SpringSource есть демо-версия REST В Spring MVC. Кривая обучения низкая, но получение демоверсии может занять некоторое время благодаря зависимостям. Как только вы получите настройку и получите рабочую демоверсию, самая сложная часть должна быть закончена.
Для интеграции IDE проверьте Spring Roo. Я не использовал его, но я слышал, что у него есть некоторые функции, которые интегрируются с Eclipse IDE, чтобы облегчить вашу жизнь.
Restlets
Рестарты были предназначены исключительно для REST. В результате накладные расходы намного ниже Spring 3.0. Пустышки лучше подходят для случаев, когда у вас нет графического интерфейса, и где вы не связаны с MVC. Пустыни могут легко обслуживать как сервер, так и клиент. Он также имеет встроенный сервер, который вы можете запустить, что устраняет необходимость в контейнере типа Jetty или Tomcat.
У меня было очень мало воздействия на Python, но из того, что я видел в реализации приложения Google App Engine в рамках webApp, концепция Router очень похожа. Те, у кого есть фон Python, могут найти, что кривая обучения будет намного ниже:
@Override
public Restlet createInboundRoot() {
Router router = new Router(getContext());
getConnectorService().getClientProtocols().add(Protocol.FILE);
// Serve the files generated by the GWT compilation step.
Directory dir = new Directory(getContext(), LocalReference.createFileReference(new File("war/")));
router.attachDefault(dir);
router.attach("/contacts/123", ContactServerResource.class);
return router;
}
Он использует GWT на стороне клиента; Я предпочитаю принять эту часть, поскольку это слишком сильно напоминает Java Swing. Хотя некоторые люди могут найти это выгодным, мое личное предпочтение - придерживаться технологий, которые больше похожи на Интернет.
Ниже приведен простой пример сервера REST, использующего автономный режим. Сервер работает на порту 8182, и он прослушивает запросы GET. Он имеет аналогичную модель на основе аннотаций в качестве рамки Spring REST, которая также помогает разделить различные методы HTTP и указать их разными способами в ваших классах. Это очень простой пример "Hello World" REST:
public class FirstServerResource extends ServerResource {
public static void main(String[] args) throws Exception {
// Create the HTTP server and listen on port 8182
new Server(Protocol.HTTP, 8182, FirstServerResource.class).start();
}
@Get
public String toString() {
return "hello, world";
}
}
Ознакомьтесь с веб-сайтом-реестром для получения дополнительной информации и примеров рамочной базы. У остатков есть немного меньше кривой обучения, чем Spring, поскольку она нацелена на REST; в результате он не содержит всех дополнительных функций, включенных в Spring, которые иногда могут затруднить поиск ответа на проблему. Рестарты, безусловно, подходят, если вы ищете что-то легкое.
Обе эти структуры будут работать в Tomcat, Jetty, а также в Google App Engine.
Ответ 2
Если вы используете Java и знакомы с Spring, то вам обязательно стоит взглянуть на Spring MVC 3.x. Эта версия удаляется от уродливой конфигурации XML, и ее синтаксис очень похож на спецификации JAX-RS. Тем не менее, если вы знаете Spring, то обучение Spring MVC 3.0 будет минимальным. Однако, если у вас возникли проблемы с пониманием с использованием шаблона IoC, а что нет, то это будет долгий болезненный опыт.:)
Имейте в виду, что Spring MVC 3.x не чистый REST, и он никогда не будет в будущем вообще, на основе Spring разработчиков MVC. Их было уже так много хороших реализаций REST, и нет смысла делать Spring MVC 3.x полностью RESTful.
Другим вариантом, который я, безусловно, рекомендую вам, является Jersey. Джерси - чистый ОТДЫХ, в другом слове, это реализация JAX-RS. Джерси взял мне 30 минут, чтобы узнать. На мой взгляд, аннотации настолько мощнее и богаче, чем Spring MVC 3.x. Аннотации из Spring MVC 3.x кажутся мне довольно ванилью. Джерси автоматически генерирует WADL для вас, хотя он довольно простой... но с одним лучше, чем с отсутствием. Вы можете, конечно, настроить свой WADL, если хотите. (Кстати, WADL - это REST-версия WSDL, если вы не знаете, что это значит). Джерси в основном обнаруживает ваш пакет, содержащий все классы Resource
, и генерирует WADL на основе ваших конфигураций, довольно аккуратных вещей. Последнее, что я хочу отметить, - у Джерси есть отличная тестовая среда для вас, чтобы легко протестировать ваш Restful web-сервис. Другими словами, их тестовая среда позволяет вашему unit test легко запускать Grizzly или сервер с памятью для тестирования вашего веб-сервиса. Это, безусловно, одно из лучших, что я использовал до сих пор. Здесь очень простой учебник для вас, чтобы ваши ноги были мокрыми: http://www.vogella.de/articles/REST/article.html. Это действительно THAT легко.:)
FYI, я использовал оба Spring MVC 3.x и Jersey.
Ответ 3
ServiceStack является одним из последних событий. Я еще многого не сделал с этим, но пока это довольно мило.
Ответ 4
Ruby и Rails (Ruby on Rails) имеют отличную поддержку сервиса RESTful. На самом деле Rails поддерживает и поощряет проектирование и разработку в RESTful способом.
Благодаря рубиновой сильной функции DSL, запись службы REST очень проста и проста. Поскольку у вас есть опыт python, обучение рубину может быть легким.
Обратитесь к этому guide, чтобы создать впечатление, как определяются URL-адреса остальных (называемых маршрутами в рельсах).
Другие веб-фреймворки Ruby, такие как Sinatra, также хорошо справляются с этим.
Кстати, самое лучшее, что и рубин, и рельсы - с открытым исходным кодом, а рубиновое сообщество - потрясающее и очень активное.
Ответ 5
Там RESTSharp в качестве клиента REST/HTTP (проект с открытым исходным кодом) и OpenRasta
Ответ 6
Я приветствую вас, чтобы проверить servicestack.net, он предназначен для простоты и скорости и вводит очень низкие искусственные концепции, где он может поддерживать очень СУХОЙ и сжатый API и автоматически работает из коробки без какой-либо конфигурации или кода.
Он поощряет передовые методы, поскольку он моделируется вокруг Мартин Фаулерс Шлюз и шаблон DTO для разработки удаленных служб.
Эквивалентный код для примера Spring.NET выше был бы
Конфигурация (в AppHost)
Routes.Add<Booking>("/hotels/{HotelId}/bookings/{BookingId}");
Код С#
public class BookingService : RestServiceBase<Booking>
{
public IHotelService hotelService { get; set; } //auto-injected by IOC
public object OnGet(Booking request)
{
var hotel = hotelService.GetHotel(request.HotelId);
var booking = hotel.GetBooking(request.BookingId);
return booking;
}
}
Аналогичный пример службы бронирования можно увидеть в живой демоверсии Northwind Web Services.
Чтобы вся конфигурация и код (exc DTO) вам нужно написать для этой службы, и она автоматически доступна через JSON, XML, JSV, CSV, SOAP 1.1/1.2 и конечные точки HTML и форматы автоматически без какой-либо дополнительной настройки.
Ознакомьтесь с примером Hello World для получения дополнительной информации обо всех предоставляемых конечных точках и форматах, а также об автогенерированных/метаданных и страницах документации.
Ответ 7
Существует основа с открытым исходным кодом, полностью разработанная для веб-сервисов RESTful, которая называется Recess
Он не очень старый, но получил хорошее внимание от промышленности. Alcatel-Lucene уже организовал конкурс на TopCoder для разработки некоторых своих сервисов с использованием этой структуры.
Ознакомьтесь с деталями на веб-сайте Recess