Создание Web-сервисов REST при помощи Java-технологий

Познакомьтесь с JAX-RS – упрощенной и легче интегрируемой альтернативой сервисам SOAP

JAX-RS (JSR-311) - это API в Java™, обеспечивающий простое и быстрое создание REST-сервисов. Он предлагает модель описания распределенных ресурсов на основе аннотаций, при помощи которых описываются местоположение и представление ресурсов, а также подключаемая архитектура для связывания с данными. В этой статье рассказывается об использовании JAX-PS в целях извлечения максимальной выгоды от архитектуры REST в среде Java EE.

Дастин Эмрхайн, разработчик программного обеспечения, IBM

Author photoДастин Эмрхайн (Dustin Amrhein) – разработчик программного обеспечения, в настоящее время занимающийся поддержкой Web-сервисов в сервере приложений WebSphere. Ранее он работал над средой выполнения Web-сервисов в Web Services Feature Pack для WebSphere 6.1, WebSphere  7.0 и был одним из тех, кто стоял у истоков направления по разработке REST-сервисов на Java в IBM. Он также является участником проекта с открытым исходным кодом Apache Axis2.



Ник Гальярдо, разработчик программного обеспечения, IBM

Photo of Nick GallardoНик Гальярдо (Nick Gallardo) – разработчик программного обеспечения из Остина, штат Техас. Он принимал участие в разработке различных компонентов сервера приложений WebSphere начиная с версии 5.0. Ник является участником проекта с открытым исходным кодом Apache Axis2, а также проекта по поддержке REST и JAX-PS в WebSphere.



20.12.2010

Введение

JAX-RS (JSR-311) – это спецификация, описывающая сервисы, работающие по принципам REST, в среде Java EE. Подобные сервисы представляют собой реализуемую на практике альтернативу традиционным Web-сервисам, использующим протокол SOAP.

В этой статье рассказывается об основных компонентах JAX-RS. Кроме того, в ней приводится пример того, как корпоративное приложение может предоставлять информацию о сотрудниках при помощи REST-сервиса, созданного с использованием JAX-RS.


Предварительные сведения

В течение последних нескольких лет разработчики создавали REST-сервисы для своих Java-приложений, используя самые разнообразные технологии. Архитектура REST отличается своей простотой, требуя от приложений обеспечить только возможность приема сообщений с HTTP-заголовками. Эта функция легко реализуется простыми Web-контейнерами для Java-приложений.

REST-приложения часто создаются на основе сервлетов. Сервлеты не предписывают какие-либо конкретные походы к разработке. Как правило, сервлеты получают на обработку запросы, анализируют их заголовки, в том числе URI, чтобы определить, к какому ресурсу выполняется обращение. Ряд API был создан на основе этой простой модели сервлетов. Несмотря на все усилия по формализации, ни один из этих API не превратился в официальный стандарт.

Учитывая рост популярности архитектуры REST, организация Java Community Process (JCP) начала работу над официальной поддержкой REST в будущем релизе Java EE 6. В итоге появился документ JSR-311, а также спецификация JAX-RS 1.0, описывающая подход к созданию REST-сервисов на основе аннотаций. В отличие от модели на основе сервлетов, аннотации JAX-RS позволяют разработчикам сосредоточиться на прикладных ресурсах и данных, не отвлекаясь на вопросы, связанные с обменом информацией (как в случае сервлетов).


Ресурсы в Java

JAX-RS задает унифицированный способ описания ресурсов на основе своей модели программирования. Он включает пять основных компонентов: корневые ресурсы, дочерние ресурсы, методы ресурсов, методы дочерних ресурсов и локаторы дочерних ресурсов.

Корневые ресурсы

Корневыми ресурсами являются Java-классы, отмеченные аннотацией @Path. Эта аннотация включает атрибут value, задающий путь к ресурсу. Его значением могут быть строка символов, переменные, а также переменные в сочетании с регулярным выражением. Пример приведен в листинге 1.

Листинг 1. Пример корневого ресурса в JAX-RS
package com.ibm.jaxrs.sample.organization;

import javax.ws.rs.Path;

@Path(value="/contacts")
public class ContactsResource {
	...
}

Дочерние ресурсы

Дочерними ресурсами (subresources) являются Java-классы, полученные в результате вызова локатора. Они аналогичны корневым ресурсам за тем исключением, что они не помечаются аннотацией @Path, поскольку путь к ним описывается в локаторе. Дочерние ресурсы, как правило, содержат методы с аннотациями, задающими тип обрабатываемых HTTP-запросов. Если они не содержат таких методов, то делегируют обработку запросов подходящему локатору дочерних ресурсов.

Листинг 2. Пример дочернего ресурса в JAX-RS
package com.ibm.jaxrs.sample.organization;

import javax.ws.rs.GET;

public class Department {
	

	
	@GET
	public String getDepartmentName() {
		...
	}
	

	
}

В листинге 2 показано объявление метода ContactsResource.getContactDepartment, возвращающего дочерний ресурс. В этом примере HTTP-запросы типа GET, направленные по адресу /contact/{contactName}/department, будут обрабатываться методом getDepartmentName дочернего ресурса Department.

Методы ресурсов

Методами ресурсов называются методы Java-классов, представляющих собой корневые или дочерние ресурсы. Эти методы привязаны к типам HTTP-запросов при помощи аннотаций, например аннотации @GET (листинг 3).

Листинг 3. Пример метода ресурса в JAX-RS
package com.ibm.jaxrs.sample.organization;

import java.util.List;
import javax.ws.rs.GET;
import javax.ws.rs.Path;

@Path(value="/contacts")
public class ContactsResource {
	
	
	
	@GET
	public List<ContactInfo> getContacts() {
		...
	}
	

}

В примере, приведенном в листинге 3, показано объявление ресурсного метода getContacts(), отвечающего за обработку запросов по адресу /contacts.

Методы дочерних ресурсов

Методы дочерних ресурсов аналогичны методам ресурсов за тем исключением, что они дополнительно отмечены аннотацией @Path, уточняющей, в каких случаях их следует вызывать.

Листинг 4. Пример метода дочернего ресурса в JAX-RS
package com.ibm.jaxrs.sample.organization;

import java.util.List;
import javax.ws.rs.GET;
import javax.ws.rs.Path;

@Path(value="/contacts")
public class ContactsResource {
	
	@GET
	public List<ContactInfo> getContacts() {
		...
	}
	
	
	
	@GET
	@Path(value="/ids")
	public List<String> getContactIds() {
		...
	}
	

}

В листинге 4 показан аннотированный метод getContactIds(), обрабатывающий HTTP-запросы типа GET, отправленные по адресу /contacts/ids.

Локаторы дочерних ресурсов

Локаторы дочерних ресурсов представляют собой методы, служащие для уточнения того, какой ресурс должен обрабатывать входящий запрос. Подобно методам дочерних ресурсов они отмечаются аннотацией @Path, однако в отличие от тех, они не привязаны к типам HTTP-запросов, в частности, у них аннотации @GET.

Листинг 5. Пример локатора дочернего ресурса в JAX-RS
package com.ibm.jaxrs.sample.organization;

import java.util.List;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;

@Path(value="/contacts")
public class ContactsResource {
	
	@GET
	public List<ContactInfo> getContactss() {
		...
	}
	
		@GET
	@Path(value="/ids")
	public List<String> getContactIds() {
		...
	}
	
	
	
	@Path(value="/contact/{contactName}/department")
	public Department getContactDepartment(@PathParam(value="contactName") 
		String contactName) {
		...
	}
	

}

В примере, приведенном в листинге 5, любой HTTP-запрос, отправленный по адресу /contact/{contactName}/department, будет обработан локатором getContactDepartment. Фрагмент {contactName} относительного пути запроса означает, что вслед за префиксом contact может следовать любая последовательность символов, удовлетворяющая правилам URL.


Аннотации

Далее мы рассмотрим основные аннотации и варианты их применения. Полный список аннотаций приведен в спецификации JAX-RS (см. ссылку на документ JSR-311 в разделе Ресурсы).

Аннотация @Path

Аннотация @Path используется для описания пути к корневому ресурсу, дочернему ресурсу или описания метода дочернего ресурса. Атрибут value может содержать символы, простые переменные, а также переменные, включающие регулярные выражения. Основной вариант использования этой аннотации иллюстрируется в листинге 6.

Листинг 6. Примеры использования аннотации @Path
package com.ibm.jaxrs.sample.organization;

import java.util.List;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;

@Path(value="/contacts")
public class ContactsResource {

		
	@GET
	@Path(value="/{emailAddress:.+@.+\\.[a-z]+}")
	public ContactInfo getByEmailAddress(@PathParam(value="emailAddress") 
		String emailAddress) {
		...
	}
	
	@GET
	@Path(value="/{lastName}")
	public ContactInfo getByLastName(@PathParam(value="lastName") String lastName) {
		...
	}
}

Аннотации, которыми отмечен класс ContactsResource, говорят о том, что все запросы по относительному пути /contacts будут обрабатываться корневым ресурсом ContactsResource. Аннотация @Path метода getByEmailAddress означает, что этот метод будет обрабатывать запросы по адресу /contacts/{emailAddress}, в котором фрагмент emailAddress удовлетворяет регулярному выражению .+@.+\\.[a-z]+.

Аннотация @Path метода getByLastName  означает, что этот метод будет обрабатывать все запросы, чьи URL соответствуют шаблону /contacts/{lastName}, в котором фрагмент lastName не соответствует регулярному выражению, заданному в аннотации метода getByEmailAddress.

Аннотации @GET, @POST, @PUT, @DELETE, @HEAD

Аннотации @GET, @POST, @PUT, @DELETE и @HEAD соответствуют типам HTTP-запросов. Их можно использовать для привязки методов корневых и дочерних ресурсов к запросам соответствующих типов. Запросы типа GET передаются на обработку методам, аннотированным @GET, запросы типа @POST – методам с аннотацией @POST и т.д. При этом существует возможность определения дополнительных аннотаций для обработки нестандартных HTTP-запросов. Для этого служит аннотация  @HttpMethod.

Листинг 7. Объявление новой аннотации, соответствующей HTTP-запросам типа GET
package com.ibm.jaxrs.sample.organization;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

import javax.ws.rs.HttpMethod;

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
@HttpMethod("GET")
public @interface CustomGET {

}

В листинге 7 определяется аннотация @CustomGET, которая семантически эквивалента аннотации @GET и может использоваться вместо нее.

Аннотации @Consumes и @Produces

Аннотация @Consumes задает типы содержимого MIME, принимаемые ресурсом, а @Produces – типы MIME, возвращаемые ресурсом. Этими аннотациями могут отмечаться ресурсы, дочерние ресурсы, методы ресурсов и дочерних ресурсов, а также локаторы дочерних ресурсов.

Листинг 8. Примеры использования аннотаций @Consumes/@Produces
package com.ibm.jaxrs.sample.organization;

import java.util.List;
import javax.ws.rs.Consumes;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
import javax.ws.rs.Produces;

@Path(value="/contacts")
public class ContactsResource {

		
	@GET
	@Path(value="/{emailAddress:.+@.+\\.[a-z]+}")
	@Produces(value={"text/xml", "application/json"})
	public ContactInfo getByEmailAddress(@PathParam(value="emailAddress") 
		String emailAddress) {
		...
	}
	
	@GET
	@Path(value="/{lastName}")
	@Produces(value="text/xml")
	public ContactInfo getByLastName(@PathParam(value="lastName") String lastName) {
		...
	}
	
	@POST
	@Consumes(value={"text/xml", "application/json"})
	public void addContactInfo(ContactInfo contactInfo) {
		...
	}
}

Методы getByEmailAddress и addContactInfo, показанные в листинге 8, могут обрабатывать запросы с типом содержимого text/xml и application/json. Представление входящего или возвращаемого ресурса зависит от параметров в заголовке HTTP-запроса, устанавливаемых клиентом. Значение аннотации @Consumes сверяется с параметром Content-Type для того, чтобы определить, способен ли метод обработать содержимое полученного запроса.

В листинге 9 показан заголовок HTTP-запроса с содержимым типа application/json, поступивший по относительному пути /contacts. Это означает, что для его обработки будет вызван метод addContactInfo класса ContactsResource.

Листинг 9. Пример заголовка запроса с заданным атрибутом Content-Type
POST /contacts HTTP/1.1
Content-Type: application/json
Content-Length: 32

В свою очередь значение аннотации @Produces сравнивается с атрибутом Accept заголовка запроса для определения того, сможет ли клиент обработать представление ресурса, возвращенное методом.

Листинг 10. Пример заголовка запроса с заданным атрибутом Accept
GET /contacts/johndoe@us.ibm.com HTTP/1.1
Accept: application/json

В листинге 10 показан заголовок запроса типа GET, поступивший по относительному пути /contacts/johndoe@us.ibm.com. Для его обработки будет вызван метод getByEmailAddress, который вернет представление ресурса в формате application/json, а не text/xml.


Провайдеры

Провайдерами в JAX-RS называются компоненты, определяющие три ключевых аспекта в поведении приложения: связывание с данными, сопоставление исключений и разрешение контекста (примером последнего может служить предоставление экземпляров JAXBContext среде выполнения). Каждый провайдер JAX-RS должен быть отмечен аннотацией @Provider. Ниже приведен пример провайдеров MessageBodyWriter и MessageBodyReader, реализующих операции связывания с данными.

Провайдер MessageBodyWriter

Экземпляры этого класса используются средой выполнения JAX-RS для сериализации представления возвращаемого клиенту ресурса. Реализации сред выполнения, удовлетворяющие JSR-311, должны самостоятельно поддерживать общеупотребительные типы данных, в том числе java.lang.String, java.io.InputStream, объекты JAXB и т.д., однако пользователь может указать среде, что следует использовать предоставленный ей провайдер (класс-наследник MessageBodyWriter). Например, вы можете передать среде провайдер для сериализации экземпляров нестандартного типа ContactInfo (листинг 11).

Листинг 11. Провайдер-наследник MessageBodyWriter
package com.ibm.jaxrs.sample.organization;

import javax.ws.rs.Consumes;
import javax.ws.rs.Produces;
import javax.ws.rs.ext.MessageBodyWriter;
import javax.ws.rs.ext.Provider;

@Provider
@Produces("text/xml")
public class ContactInfoWriter implements MessageBodyWriter<ContactInfo> {

	public long	getSize(T t, java.lang.Class<ContactInfo> type, 
		java.lang.reflect.Type genericType, java.lang.annotation.Annotation[] 
		annotations, MediaType mediaType)  {
		...
	}
	
	public boolean isWriteable(java.lang.Class<ContactInfo> type, 
		java.lang.reflect.Type genericType, java.lang.annotation.Annotation[] 
		annotations, MediaType mediaType) {
		return true;
	}
	
	public void writeTo(ContactInfo contactInfo, java.lang.Class<ContactInfo> type, 
		java.lang.reflect.Type genericType, java.lang.annotation.Annotation[] 
		annotations, MediaType mediaType, MultivaluedMap<
		java.lang.String, java.lang.Object> httpHeaders, java.io.OutputStream 
		entityStream) {
		contactInfo.serialize(entityStream);
	}
}

Класс ContactInfoWriter будет вызываться средой JAX-RS перед сериализацией возвращаемых клиенту ресурсов. Если метод isWriteable  провайдера возвращает true, а значение его аннотации @Produces наиболее точно соответствует значению той же аннотации метода ресурса, то будет вызван метод writeTo. В этом случае класс ContactInfoWriter будет отвечать за сериализацию содержимого экземпляра ContactInfo в нижележащий поток вывода (OutputStream).

Провайдер MessageBodyReader

Провайдеры MessageBodyReaders выполняют функцию, обратную по отношению к MessageBodyWriter. Реализации JAX-RS самостоятельно поддерживают восстановление из потока ввода (эта операция называется десериализацией) экземпляров тех же типов, что и для сериализации. При этом пользователи могут предоставлять среде собственные классы-наследники MessageBodyReader. Основная функция такого провайдера заключается в чтении данных из потока ввода (InputStream) и восстановлении содержимого Java-объектов, которые ожидает получить на вход метод ресурса, из неструктурированного набора байтов. Пример дочернего класса MessageBodyReader для десериализации экземпляров ContactInfo приведен в листинге 12.

Листинг 12. Пример класса-наследника MessageBodyReader
package com.ibm.jaxrs.sample.organization;

import javax.ws.rs.Consumes;
import javax.ws.rs.Produces;
import javax.ws.rs.ext.MessageBodyReader;
import javax.ws.rs.ext.Provider;

@Provider
@Consumes("text/xml")
public class ContactInfoReader implements MessageBodyReader<ContactInfo> {

	public boolean isReadable(java.lang.Class<ContactInfo> type, 
		java.lang.reflect.Type genericType, java.lang.annotation.Annotation[] 
		annotations, MediaType mediaType) {
		return true;
	}
	
	public ContactInfo readFrom(java.lang.Class<ContactInfo> type, 
		java.lang.reflect.Type genericType, java.lang.annotation.Annotation[] 
		annotations, MediaType mediaType, MultivaluedMap<
		java.lang.String,java.lang.String> httpHeaders, java.io.InputStream 
		entityStream) {
		return ContactInfo.parse(entityStream);
	}
	
}

Подобно методу MessageBodyWriter.isWriteable, метод isReadable класса ContactInfoReader будет вызываться средой JAX-RS чтобы определить, способен ли провайдер десериализовать поступающие на вход данные. Если этот метод возвращает true, а значение аннотации @Consumes наиболее точно соответствует значению той же аннотации метода ресурса, то провайдер будет выбран для десериализации. Метод readFrom должен возвращать экземпляры класса ContactInfo, содержимое которых было восстановлено из потока ввода (InputStream).


Классы, описывающие конфигурацию

Выше были рассмотрены классы ресурсов JAX-RS, а также некоторые из классов-провайдеров (MessageBodyReader и MessageBodyWriter). Далее мы перейдем к вопросам конфигурирования этих классов внутри среды выполнения JAX-RS, которое производится при помощи расширения класса javax.ws.rs.core.Application. Этот класс предоставляет список классов (или объектов-синглетонов), включающих набор всех корневых ресурсов и провайдеров приложения JAX-RS. В листинге 13 приведен пример наследника Application, который предоставляет все классы, необходимые демонстрационному приложению, работающему с контактными данными.

Листинг 13. Класс ContactInfoApplication
package com.ibm.jaxrs.sample.organization;

import java.util.HashSet;
import java.util.Set;
import javax.ws.rs.core.Application;

public class ContactInfoApplicaiton extends Application {

	public Set<Class<?>> getClasses() {
		Set<Class<?>> classes = new HashSetSet<Class<?>>();
		classes.add(ContactsResource.class);
		classes.add(ContactInfoWriter.class);
		classes.add(ContactInfoReader.class);
	}
	
	public SetSet<Object<?>> getSingletons() {
		// Пустой метод, поскольку синглетоны не используются
	}
	
}

Среда выполнения JAX-RS вызывает метод getClasses для получения списка классов, предоставляющих все необходимые метаданные. Обратите внимание на пустую реализацию метода getSingletons. Как правило, допускается реализовывать провайдеры JAX-RS в виде синглетонов, в то время как использование такого подхода для ресурсов требует повышенной аккуратности. Автоматическая вставка ссылок на объекты (инъекция) на основе аннотаций, часто используемая классами ресурсов JAX-RS, может не поддерживаться для синглетонов. Таким образом, применение синглетонов для ресурсов JAX-RS должно тщательно продумываться и в общем случае не рекомендуется.

При развертывании приложения в контейнере сервлетов у вас есть два основных варианта регистрации класса-наследника javax.ws.rs.core.Application в среде JAX-RS. Регистрация осуществляется в файле web.xml внутри Web-архива (WAR), как показано в листинге 14.

Листинг 14. Web-дескриптор при развертывании в контейнере сервлетов, напрямую не поддерживающем JAX-RS
<web-app id="WebApp_ID" version="2.5"
	xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi=
	"http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 
	http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
	<servlet>
		<servlet-name>ContactInfoServlet</servlet-name>
		<servlet-class>com.sample.RESTSystemServlet</servlet-class>
		<init-param>
			<param-name>javax.ws.rs.Application</param-name>
			<param-value>
				com.ibm.jaxrs.sample.organization.ContactInfoApplication
			</param-value>
		</init-param>
	</servlet>
	<servlet-mapping>
		<servlet-name>ContactInfoServlet</servlet-name>
		<url-pattern>/*</url-pattern>
	</servlet-mapping>
</web-app>

Если контейнер сервлетов специальным образом не поддерживает JAX-RS, имя класса-наследника Application должно быть указано в списке параметров для инициализации сервлета (init-param). Этот параметр должен называться javax.ws.rs.Application, а классом самого сервлета (параметр servlet-class), скорее всего, должен быть системный сервлет среды выполнения JAX-RS. Что касается URL запросов, которые должен обрабатывать этот сервлет, то вы можете либо перечислить все адреса, либо использовать шаблон /*, как показано в листинге 15.

Листинг 15. Web-дескриптор при развертывании в контейнере сервлетов с поддержкой JAX-RS
<web-app id="WebApp_ID" version="2.5"
	xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi=
	"http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 
	http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
	<servlet>
		<servlet-name>ContactInfoServlet</servlet-name>
		<servlet-class>
			com.ibm.jaxrs.sample.organization.ContactInfoApplication
		</servlet-class>
	</servlet>
	<servlet-mapping>
		<servlet-name>ContactInfoServlet</servlet-name>
		<url-pattern>/*</url-pattern>
	</servlet-mapping>
</web-app>

Если используется специальный контейнер с поддержкой JAX-RS, имя класса-наследника Application может быть передано в качестве значения элемента servlet-class в определении сервлета. При этом вы также можете либо перечислить все возможные URL, либо указать шаблон /*.


Использование JAX-RS с Apache Wink

Далее следует найти среду выполнения, поддерживающую возможности JAX-RS. Одной из таких реализаций, поддерживающих все функции, представленные выше, является проект Apache Wink (см. раздел Ресурсы). Этот проект был запущен при активном сотрудничестве различных компаний-разработчиков и представителей сообщества разработчиков ПО с открытым исходным кодом. Его основной целью является создание наиболее легковесной и гибкой среды выполнения JAX-RS.

В дополнение к стандартным возможностям, JAX-RS Wink предоставляет расширенную поддержку форматов сериализации JSON, Atom и RSS. Сам по себе JAX-RS не включает клиентский API, однако Wink предоставляет собственную модель подобного API, в центре которой лежит понятие ресурса.

Присоединяйтесь к группе Apache Wink на сайте "Мой developerWorks"

Вы можете обсуждать различные вопросы и обмениваться материалами, касающимися работы с Apache Wink, с другими разработчиками в группе Apache Wink на сайте "Мой developerWorks".

Если вы еще не являетесь членом сообщества "Мой developerWorks", вступите в него прямо сейчас.

Для упрощения создания собственных сервисов на основе Wink загрузите библиотеки Wink 1.0 и добавьте их в качестве реализации JAX-RS по умолчанию в вашу среду быстрой разработки RAD 7.5.5 (см. раздел Ресурсы). Этот релиз RAD включает категорию JAX-RS, которую вы можете настроить для поддержки валидаторов и содействия в добавлении аннотаций. Она также упрощает конфигурирование сервлета, автоматически создавая необходимые объявления и связывая его с URL запросов.

Заключение

По сравнению с традиционной моделью сервлетов, JAX-RS является более практичной, простой и интегрируемой альтернативой для создания сервисов по принципам REST на Java. Аннотации позволяют вам легко описывать относительные пути к Java-ресурсам, а также связывать методы Java-классов с типами HTTP-запросов. Гибкая архитектура для связывания с данными включает поддержку стандартных типов Java, а также позволяет интегрировать собственные реализации процессов сериализации и десериализации. Наконец, расширения класса javax.ws.rs.core. Application и возможность их объявления в web.xml обеспечивают легкость развертывания приложений, требующую минимум усилий по настройке.

В этой статье были затронуты лишь некоторые возможности JAX-RS. В частности, мы обошли вниманием два других типа провайдеров: ContextResolvers и ExceptionMappingProviders, при помощи которых приложение может управлять процессами предоставления контекста (например, JAXBContext) и связывания типов исключений с HTTP-ответами. Кроме того, JAX-RS включает аннотации, которые управляют инъекцией параметров методов и членов классов и предоставляют приложению важную контекстную информацию. Принимая во внимание эти возможности, JAX-RS выглядит многообещающе, представляя собой простой в использовании, гибкий и многофункциональный API для создания REST-сервисов на Java.

Ресурсы

Научиться

  • Оригинал статьи: Create RESTful Web services with Java technology (Дастин Эмрхайн и Ник Гальярдо, developerWorks, февраль 2010 г.). (EN)
  • Ознакомьтесь с проектом JSR-311 на сайте Java.net, на котором представлены черновые варианты API и спецификации, а также списки рассылки для общения с членами группы экспертов. (EN)
  • Прочитайте диссертацию Роя Филдинга (Roy Fielding) Architectural Styles and the Design of Network-based Software Architectures, в которой описываются ключевые понятия архитектуры REST. (EN)
  • Посетите сайт проекта Apache Wink. (EN)
  • Прочитайте статью Основы создания Web-сервисов по принципам REST (developerWorks, ноябрь 2008 г.), в которой приводится введение в архитектуру REST. (EN)
  • Обратитесь к книге RESTful Java with JAX-RS (Билл Бурк, Bill Burke, O'Reilly Media, ноябрь 2009), представляющей собой практическое руководство по проектированию и реализации распределенных Web-сервисов Java EE 6 с использованием архитектурных принципов REST и спецификации JAX-RS. (EN)
  • Технические мероприятия и Web-трансляции developerWorks: в этих разделах можно получить самую актуальную информацию о современных технологиях. (EN)

Получить продукты и технологии

  • Загрузите Apache Wink - инфраструктуру для создания Web-сервисов по принципам REST. (EN)
  • Загрузите ознакомительные версии продуктов IBM и опробуйте инструменты разработки приложений, а также связующее программное обеспечение IBM семейств DB2®, Lotus®, Rational®, Tivoli® и WebSphere®. (EN)

Обсудить

Комментарии

developerWorks: Войти

Обязательные поля отмечены звездочкой (*).


Нужен IBM ID?
Забыли Ваш IBM ID?


Забыли Ваш пароль?
Изменить пароль

Нажимая Отправить, Вы принимаете Условия использования developerWorks.

 


Профиль создается, когда вы первый раз заходите в developerWorks. Информация в вашем профиле (имя, страна / регион, название компании) отображается для всех пользователей и будет сопровождать любой опубликованный вами контент пока вы специально не укажите скрыть название вашей компании. Вы можете обновить ваш IBM аккаунт в любое время.

Вся введенная информация защищена.

Выберите имя, которое будет отображаться на экране



При первом входе в developerWorks для Вас будет создан профиль и Вам нужно будет выбрать Отображаемое имя. Оно будет выводиться рядом с контентом, опубликованным Вами в developerWorks.

Отображаемое имя должно иметь длину от 3 символов до 31 символа. Ваше Имя в системе должно быть уникальным. В качестве имени по соображениям приватности нельзя использовать контактный e-mail.

Обязательные поля отмечены звездочкой (*).

(Отображаемое имя должно иметь длину от 3 символов до 31 символа.)

Нажимая Отправить, Вы принимаете Условия использования developerWorks.

 


Вся введенная информация защищена.


static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=40
Zone=Web-архитектура, SOA и web-сервисы
ArticleID=604246
ArticleTitle=Создание Web-сервисов REST при помощи Java-технологий
publish-date=12202010