Веб-сервисы RESTful — Введение
REST означает REpresentational State Transfer. REST — это архитектура, основанная на веб-стандартах и использующая протокол HTTP. Он вращается вокруг ресурса, где каждый компонент является ресурсом, а доступ к ресурсу осуществляется через общий интерфейс с использованием стандартных методов HTTP. REST был впервые представлен Роем Филдингом в 2000 году.
В архитектуре REST сервер REST просто предоставляет доступ к ресурсам, а клиент REST осуществляет доступ и изменяет ресурсы. Здесь каждый ресурс идентифицируется URI / глобальными идентификаторами. REST использует различные представления для представления ресурсов, таких как текст, JSON, XML. JSON является самым популярным.
Методы HTTP
Следующие четыре HTTP-метода обычно используются в архитектуре на основе REST.
-
GET — Предоставляет доступ только для чтения к ресурсу.
-
POST — используется для создания нового ресурса.
-
DELETE — используется для удаления ресурса.
-
PUT — используется для обновления существующего ресурса или создания нового ресурса.
GET — Предоставляет доступ только для чтения к ресурсу.
POST — используется для создания нового ресурса.
DELETE — используется для удаления ресурса.
PUT — используется для обновления существующего ресурса или создания нового ресурса.
Введение в веб-сервисы RESTFul
Веб-сервис — это набор открытых протоколов и стандартов, используемых для обмена данными между приложениями или системами. Программные приложения, написанные на разных языках программирования и работающие на разных платформах, могут использовать веб-сервисы для обмена данными по компьютерным сетям, таким как Интернет, аналогично межпроцессному взаимодействию на одном компьютере. Эта совместимость (например, между приложениями Java и Python или Windows и Linux) обусловлена использованием открытых стандартов.
Веб-сервисы на основе архитектуры REST известны как веб-сервисы RESTful. Эти веб-сервисы используют методы HTTP для реализации концепции архитектуры REST. Веб-служба RESTful обычно определяет URI, унифицированный идентификатор ресурса службы, обеспечивает представление ресурса, такого как JSON, и набор методов HTTP.
Создание веб-сервиса RESTFul
В следующих главах мы создадим веб-службу, скажем, управление пользователями со следующими функциями:
Sr.No. | URI | HTTP метод | Тело POST | Результат |
---|---|---|---|---|
1 | / UserService / пользователей | ПОЛУЧИТЬ | пустой | Показать список всех пользователей. |
2 | / UserService / AddUser | СООБЩЕНИЕ | JSON String | Добавить данные нового пользователя. |
3 | / UserService / GetUser /: идентификатор | ПОЛУЧИТЬ | пустой | Показать детали пользователя. |
Веб-службы RESTful — настройка среды
Из этого туториала Вы узнаете, как подготовить среду разработки к работе с Jersey Framework для создания веб-служб RESTful. В инфраструктуре Jersey реализован API -интерфейс JAX-RS 2.0 , который является стандартной спецификацией для создания веб-служб RESTful. Этот учебник также научит вас, как настроить JDK, Tomcat и Eclipse на вашем компьютере перед настройкой Jersey Framework.
Настройка Java Development Kit (JDK)
Вы можете скачать последнюю версию SDK с сайта Oracle на Java — Java SE Downloads . Инструкции по установке JDK вы найдете в загруженных файлах. Следуйте инструкциям по установке и настройке. Наконец, установите переменные среды PATH и JAVA_HOME, чтобы они ссылались на каталог, который содержит Java и Javac , обычно это java_install_dir / bin и java_install_dir соответственно.
Если вы работаете в Windows и установили JDK в C: \ jdk1.7.0_75, вам нужно будет поместить следующую строку в ваш файл C: \ autoexec.bat.
set PATH = C:\jdk1.7.0_75\bin;%PATH% set JAVA_HOME = C:\jdk1.7.0_75
Кроме того, в Windows NT / 2000 / XP вы также можете щелкнуть правой кнопкой мыши Мой компьютер → выбрать Свойства → затем Дополнительно → затем Переменные среды. Затем вы обновите значение PATH и нажмете кнопку ОК.
В Unix (Solaris, Linux и т. Д.), Если SDK установлен в /usr/local/jdk1.7.0_75 и вы используете оболочку C, вы должны поместить в файл .cshrc следующее.
setenv PATH /usr/local/jdk1.7.0_75/bin:$PATH setenv JAVA_HOME /usr/local/jdk1.7.0_75
В качестве альтернативы, если вы используете интегрированную среду разработки (IDE), такую как Borland JBuilder, Eclipse, IntelliJ IDEA или Sun ONE Studio, скомпилируйте и запустите простую программу, чтобы подтвердить, что IDE знает, где вы установили Java, в противном случае выполните правильную настройку в соответствии с данным документом. из IDE.
Настройка Eclipse IDE
Все примеры в этом руководстве были написаны с использованием Eclipse IDE. Итак, я бы посоветовал вам установить последнюю версию Eclipse на ваш компьютер.
Чтобы установить Eclipse IDE, загрузите последние двоичные файлы Eclipse со страницы https://www.eclipse.org/downloads/ . После загрузки установки распакуйте бинарный дистрибутив в удобное место. Например, в C: \ eclipse для Windows или / usr / local / eclipse в Linux / Unix и, наконец, установите переменную PATH соответствующим образом.
Eclipse можно запустить, выполнив следующие команды на компьютере с Windows, или вы можете просто дважды щелкнуть файл eclipse.exe.
%C:\eclipse\eclipse.exe
Eclipse можно запустить, выполнив следующие команды на компьютере Unix (Solaris, Linux и т. Д.):
$/usr/local/eclipse/eclipse
После успешного запуска, если все в порядке, на вашем экране должен появиться следующий результат —
Установка библиотек Jersey Framework
Теперь, если все в порядке, вы можете приступить к настройке фреймворка на Джерси. Ниже приведены несколько простых шагов для загрузки и установки фреймворка на ваш компьютер.
-
Выберите, хотите ли вы установить Jersey в Windows или Unix, а затем перейдите к следующему шагу, чтобы загрузить файл .zip для Windows, а затем файл .tz для Unix.
-
Загрузите последнюю версию бинарных файлов платформы Jersey по следующей ссылке — https://jersey.java.net/download.html .
-
На момент написания этого руководства я скачал jaxrs-ri-2.17.zip на свой компьютер с Windows, и когда вы распакуете загруженный файл, он даст вам структуру каталогов внутри E: \ jaxrs-ri-2.17 \ jaxrs-ri, как показано на следующем скриншоте.
Выберите, хотите ли вы установить Jersey в Windows или Unix, а затем перейдите к следующему шагу, чтобы загрузить файл .zip для Windows, а затем файл .tz для Unix.
Загрузите последнюю версию бинарных файлов платформы Jersey по следующей ссылке — https://jersey.java.net/download.html .
На момент написания этого руководства я скачал jaxrs-ri-2.17.zip на свой компьютер с Windows, и когда вы распакуете загруженный файл, он даст вам структуру каталогов внутри E: \ jaxrs-ri-2.17 \ jaxrs-ri, как показано на следующем скриншоте.
Вы найдете все библиотеки Джерси в каталогах C: \ jaxrs-ri-2.17 \ jaxrs-ri \ lib и зависимости в C: \ jaxrs-ri-2.17 \ jaxrs-ri \ ext . Убедитесь, что вы правильно установили переменную CLASSPATH в этом каталоге, иначе вы столкнетесь с проблемой при запуске приложения. Если вы используете Eclipse, то не нужно устанавливать CLASSPATH, потому что все настройки будут выполнены через Eclipse.
Настройка Apache Tomcat
Вы можете загрузить последнюю версию Tomcat с https://tomcat.apache.org/ . После загрузки установки распакуйте бинарный дистрибутив в удобное место. Например, в C: \ apache-tomcat-7.0.59 в Windows или /usr/local/apache-tomcat-7.0.59 в Linux / Unix и установите переменную среды CATALINA_HOME, указывающую на места установки.
Tomcat можно запустить, выполнив следующие команды на компьютере с Windows, или вы можете просто дважды щелкнуть на файле startup.bat.
%CATALINA_HOME%\bin\startup.bat
или же
C:\apache-tomcat-7.0.59\bin\startup.bat
Tomcat можно запустить, выполнив следующие команды на компьютере с Unix (Solaris, Linux и т. Д.):
$CATALINA_HOME/bin/startup.sh
или же
/usr/local/apache-tomcat-7.0.59/bin/startup.sh
После успешного запуска веб-приложения по умолчанию, включенные в Tomcat, будут доступны по адресу http: // localhost: 8080 / . Если все хорошо, то должен отобразиться следующий результат —
Дополнительную информацию о настройке и запуске Tomcat можно найти в документации, представленной на этой странице. Эту информацию также можно найти на веб-сайте Tomcat — https://tomcat.apache.org.
Tomcat можно остановить, выполнив следующие команды на компьютере с Windows —
%CATALINA_HOME%\bin\shutdown
или же
C:\apache-tomcat-7.0.59\bin\shutdown
Tomcat можно остановить, выполнив следующие команды на компьютере с Unix (Solaris, Linux и т. Д.):
$CATALINA_HOME/bin/shutdown.sh
или же
/usr/local/apache-tomcat-7.0.59/bin/shutdown.sh
Как только вы закончите с этим последним шагом, вы готовы приступить к первому примеру на Джерси, который вы увидите в следующей главе.
Веб-сервисы RESTful — первое приложение
Давайте начнем писать реальные веб-сервисы RESTful с Jersey Framework. Прежде чем вы начнете писать свой первый пример с использованием Jersey Framework, вы должны убедиться, что вы правильно настроили среду Jersey, как описано в главе RESTful Web Services — Environment Environment Setup . Здесь я также предполагаю, что вы немного знакомы с Eclipse IDE.
Итак, давайте приступим к написанию простого приложения на Джерси, которое предоставит метод веб-службы для отображения списка пользователей.
Создание проекта Java
Первым шагом является создание динамического веб-проекта с использованием Eclipse IDE. Выберите пункт « Файл» → «Создать» → «Проект» и, наконец, выберите мастер « Динамический веб-проект» из списка. Теперь назовите ваш проект как UserManagement с помощью окна мастера, как показано на следующем снимке экрана —
Как только ваш проект будет успешно создан, вы увидите следующее содержимое в Project Explorer —
Добавление необходимых библиотек
В качестве второго шага добавим Jersey Framework и его зависимости (библиотеки) в наш проект. Скопируйте все jar-файлы из следующих каталогов загрузочной zip-папки jersey в директорию WEB-INF / lib проекта.
- \ Jaxrs-ри-2,17 \ jaxrs-ри \ апи
- \ Jaxrs-ри-2,17 \ jaxrs-ри \ внутр
- \ Jaxrs-ри-2,17 \ jaxrs-ри \ Lib
Теперь щелкните правой кнопкой мыши на имени вашего проекта UserManagement и выберите параметр, доступный в контекстном меню — « Путь сборки» → «Настроить путь сборки» для отображения окна «Путь сборки Java».
Теперь используйте кнопку « Добавить JAR» , доступную на вкладке « Библиотеки », чтобы добавить JAR, присутствующие в каталоге WEBINF / lib.
Создание исходных файлов
Теперь давайте создадим фактические исходные файлы в проекте UserManagement . Сначала нам нужно создать пакет с именем com.tutorialspoint . Для этого щелкните правой кнопкой мыши на src в разделе проводника пакетов и выберите опцию — Создать → Пакет .
Далее мы создадим файлы UserService.java, User.java, UserDao.java в пакете com.tutorialspoint.
User.java
package com.tutorialspoint; import java.io.Serializable; import javax.xml.bind.annotation.XmlElement; import javax.xml.bind.annotation.XmlRootElement; @XmlRootElement(name = "user") public class User implements Serializable { private static final long serialVersionUID = 1L; private int id; private String name; private String profession; public User(){} public User(int id, String name, String profession){ this.id = id; this.name = name; this.profession = profession; } public int getId() { return id; } @XmlElement public void setId(int id) { this.id = id; } public String getName() { return name; } @XmlElement public void setName(String name) { this.name = name; } public String getProfession() { return profession; } @XmlElement public void setProfession(String profession) { this.profession = profession; } }
UserDao.java
package com.tutorialspoint; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; import java.util.ArrayList; import java.util.List; public class UserDao { public List<User> getAllUsers(){ List<User> userList = null; try { File file = new File("Users.dat"); if (!file.exists()) { User user = new User(1, "Mahesh", "Teacher"); userList = new ArrayList<User>(); userList.add(user); saveUserList(userList); } else{ FileInputStream fis = new FileInputStream(file); ObjectInputStream ois = new ObjectInputStream(fis); userList = (List<User>) ois.readObject(); ois.close(); } } catch (IOException e) { e.printStackTrace(); } catch (ClassNotFoundException e) { e.printStackTrace(); } return userList; } private void saveUserList(List<User> userList){ try { File file = new File("Users.dat"); FileOutputStream fos; fos = new FileOutputStream(file); ObjectOutputStream oos = new ObjectOutputStream(fos); oos.writeObject(userList); oos.close(); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } }
UserService.java
package com.tutorialspoint; import java.util.List; import javax.ws.rs.GET; import javax.ws.rs.Path; import javax.ws.rs.Produces; import javax.ws.rs.core.MediaType; @Path("/UserService") public class UserService { UserDao userDao = new UserDao(); @GET @Path("/users") @Produces(MediaType.APPLICATION_XML) public List<User> getUsers(){ return userDao.getAllUsers(); } }
В отношении основной программы следует отметить два важных момента:
UserService.java
-
Первый шаг — указать путь для веб-службы с помощью аннотации @Path к UserService.
-
Второй шаг — указать путь для конкретного метода веб-службы, используя аннотацию @Path для метода UserService.
Первый шаг — указать путь для веб-службы с помощью аннотации @Path к UserService.
Второй шаг — указать путь для конкретного метода веб-службы, используя аннотацию @Path для метода UserService.
Создание файла конфигурации Web.xml
Вам необходимо создать файл конфигурации Web xml, который является файлом XML и используется для указания сервлета платформы Jersey для нашего приложения.
web.xml
<?xml version = "1.0" encoding = "UTF-8"?> <web-app xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance" xmlns = "http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id = "WebApp_ID" version = "3.0"> <display-name>User Management</display-name> <servlet> <servlet-name>Jersey RESTful Application</servlet-name> <servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class> <init-param> <param-name>jersey.config.server.provider.packages</param-name> <param-value>com.tutorialspoint</param-value> </init-param> </servlet> <servlet-mapping> <servlet-name>Jersey RESTful Application</servlet-name> <url-pattern>/rest/*</url-pattern> </servlet-mapping> </web-app>
Развертывание программы
Когда вы закончите создавать исходные файлы и файлы веб-конфигурации, вы будете готовы к этому шагу, который компилирует и запускает вашу программу. Для этого, используя Eclipse, экспортируйте ваше приложение как файл war и разверните его в tomcat.
Чтобы создать файл WAR с использованием Eclipse, выберите « Файл» → «Экспорт» → «Интернет» → «Файл войны» и, наконец, выберите «UserManagement» проекта и папку назначения. Чтобы развернуть файл war в Tomcat, поместите файл UserManagement.war в каталог установки Tomcat → каталог webapps и запустите Tomcat.
Запуск программы
Мы используем Postman , расширение для Chrome, для тестирования наших веб-сервисов.
Сделайте запрос к UserManagement, чтобы получить список всех пользователей. Поместите http: // localhost: 8080 / UserManagement / rest / UserService / users в POSTMAN с GET-запросом и увидите следующий результат.
Поздравляем, вы успешно создали свое первое приложение RESTful.
Веб-сервисы RESTful — Ресурсы
Что такое ресурс?
Архитектура REST рассматривает каждый контент как ресурс. Этими ресурсами могут быть текстовые файлы, HTML-страницы, изображения, видео или динамические бизнес-данные. Сервер REST просто предоставляет доступ к ресурсам, а клиент REST осуществляет доступ и изменяет ресурсы. Здесь каждый ресурс идентифицируется URI / Global ID. REST использует различные представления для представления ресурса, где Text, JSON, XML. Самые популярные представления ресурсов — это XML и JSON.
Представление ресурсов
Ресурс в REST является похожим объектом в объектно-ориентированном программировании или похож на сущность в базе данных. Как только ресурс идентифицирован, его представление должно быть решено с использованием стандартного формата, чтобы сервер мог отправлять ресурс в вышеупомянутом формате, и клиент мог понимать тот же формат.
Например, в главе RESTful Web Services — первое приложение пользователь — это ресурс, который представлен в следующем формате XML:
<user> <id>1</id> <name>Mahesh</name> <profession>Teacher</profession> </user>
Этот же ресурс может быть представлен в формате JSON следующим образом:
{ "id":1, "name":"Mahesh", "profession":"Teacher" }
Хорошее Представление Ресурсов
REST не накладывает никаких ограничений на формат представления ресурса. Клиент может запросить представление JSON, тогда как другой клиент может запросить представление XML того же ресурса на сервере и так далее. Сервер REST отвечает за передачу клиенту ресурса в формате, понятном клиенту.
Ниже приведены некоторые важные моменты, которые необходимо учитывать при разработке формата представления ресурса в веб-службах RESTful.
-
Понятность — и Сервер, и Клиент должны уметь понимать и использовать формат представления ресурса.
-
Полнота — Формат должен уметь полностью представлять ресурс. Например, ресурс может содержать другой ресурс. Формат должен уметь представлять как простые, так и сложные структуры ресурсов.
-
Связываемость — ресурс может иметь связь с другим ресурсом, формат должен быть в состоянии справиться с такими ситуациями.
Понятность — и Сервер, и Клиент должны уметь понимать и использовать формат представления ресурса.
Полнота — Формат должен уметь полностью представлять ресурс. Например, ресурс может содержать другой ресурс. Формат должен уметь представлять как простые, так и сложные структуры ресурсов.
Связываемость — ресурс может иметь связь с другим ресурсом, формат должен быть в состоянии справиться с такими ситуациями.
Однако в настоящее время большинство веб-служб представляют ресурсы в формате XML или JSON. Существует множество библиотек и инструментов, доступных для понимания, анализа и изменения данных XML и JSON.
Веб-службы RESTful — Сообщения
Веб-службы RESTful используют протоколы HTTP в качестве средства связи между клиентом и сервером. Клиент отправляет сообщение в форме HTTP-запроса, а сервер отвечает в виде HTTP-ответа. Эта техника называется обмен сообщениями. Эти сообщения содержат данные сообщения и метаданные, т.е. информацию о самом сообщении. Давайте посмотрим на сообщения HTTP Request и HTTP Response для HTTP 1.1.
HTTP-запрос
HTTP-запрос состоит из пяти основных частей —
-
Глагол — указывает методы HTTP, такие как GET, POST, DELETE, PUT и т. Д.
-
URI — универсальный идентификатор ресурса (URI) для идентификации ресурса на сервере.
-
Версия HTTP — указывает версию HTTP. Например, HTTP v1.1.
-
Заголовок запроса — содержит метаданные для сообщения HTTP-запроса в виде пар ключ-значение. Например, тип клиента (или браузера), формат, поддерживаемый клиентом, формат тела сообщения, настройки кэша и т. Д.
-
Тело запроса — содержание сообщения или представление ресурса.
Глагол — указывает методы HTTP, такие как GET, POST, DELETE, PUT и т. Д.
URI — универсальный идентификатор ресурса (URI) для идентификации ресурса на сервере.
Версия HTTP — указывает версию HTTP. Например, HTTP v1.1.
Заголовок запроса — содержит метаданные для сообщения HTTP-запроса в виде пар ключ-значение. Например, тип клиента (или браузера), формат, поддерживаемый клиентом, формат тела сообщения, настройки кэша и т. Д.
Тело запроса — содержание сообщения или представление ресурса.
HTTP-ответ
HTTP-ответ состоит из четырех основных частей:
-
Код состояния / ответа — указывает состояние сервера для запрошенного ресурса. Например, 404 означает, что ресурс не найден, а 200 означает, что ответ в порядке.
-
Версия HTTP — указывает версию HTTP. Например HTTP v1.1.
-
Заголовок ответа — содержит метаданные для ответного сообщения HTTP в виде пар значений ключей. Например, длина контента, тип контента, дата ответа, тип сервера и т. Д.
-
Тело ответа — содержание сообщения ответа или представление ресурса.
Код состояния / ответа — указывает состояние сервера для запрошенного ресурса. Например, 404 означает, что ресурс не найден, а 200 означает, что ответ в порядке.
Версия HTTP — указывает версию HTTP. Например HTTP v1.1.
Заголовок ответа — содержит метаданные для ответного сообщения HTTP в виде пар значений ключей. Например, длина контента, тип контента, дата ответа, тип сервера и т. Д.
Тело ответа — содержание сообщения ответа или представление ресурса.
пример
Как мы объяснили в главе RESTful Web Services — первое приложение , давайте поместим http: // localhost: 8080 / UserManagement / rest / UserService / users в POSTMAN с помощью запроса GET. Если вы нажмете кнопку «Просмотр», которая находится рядом с кнопкой «Отправить», а затем нажмите кнопку «Отправить», вы можете увидеть следующий вывод.
Здесь вы можете видеть, что браузер отправил запрос GET и получил тело ответа в виде XML.
Веб-сервисы RESTful — адресация
Адресация относится к поиску ресурса или нескольких ресурсов, лежащих на сервере. Это аналогично поиску почтового адреса человека.
Каждый ресурс в архитектуре REST идентифицируется своим URI (унифицированным идентификатором ресурса). URI имеет следующий формат —
<protocol>://<service-name>/<ResourceType>/<ResourceID>
Назначение URI — найти ресурс (ы) на сервере, на котором размещен веб-сервис. Другим важным атрибутом запроса является VERB, который идентифицирует операцию, выполняемую над ресурсом. Например, в главе RESTful Web Services — первое приложение URI является http: // localhost: 8080 / UserManagement / rest / UserService / users, а VERB — GET.
Построение стандартного URI
Ниже приведены важные моменты, которые необходимо учитывать при разработке URI:
-
Использовать множественное число — используйте множественное число, чтобы определить ресурсы. Например, мы использовали пользователей для идентификации пользователей как ресурса.
-
Избегайте использования пробелов — используйте подчеркивание (_) или дефис (-) при использовании длинного имени ресурса. Например, используйте author_users вместо авторизованных% 20users.
-
Используйте строчные буквы — хотя в URI регистр не учитывается, рекомендуется хранить URL только в строчных буквах.
-
Поддерживать обратную совместимость — поскольку веб-служба является общедоступной, всегда должен быть доступен URI, который когда-то был открыт. В случае обновления URI перенаправьте старый URI на новый URI, используя код состояния HTTP 300.
-
Использовать HTTP-глагол — всегда используйте HTTP-глагол, например GET, PUT и DELETE, чтобы выполнять операции с ресурсом. Неправильно использовать имя операции в URI.
Использовать множественное число — используйте множественное число, чтобы определить ресурсы. Например, мы использовали пользователей для идентификации пользователей как ресурса.
Избегайте использования пробелов — используйте подчеркивание (_) или дефис (-) при использовании длинного имени ресурса. Например, используйте author_users вместо авторизованных% 20users.
Используйте строчные буквы — хотя в URI регистр не учитывается, рекомендуется хранить URL только в строчных буквах.
Поддерживать обратную совместимость — поскольку веб-служба является общедоступной, всегда должен быть доступен URI, который когда-то был открыт. В случае обновления URI перенаправьте старый URI на новый URI, используя код состояния HTTP 300.
Использовать HTTP-глагол — всегда используйте HTTP-глагол, например GET, PUT и DELETE, чтобы выполнять операции с ресурсом. Неправильно использовать имя операции в URI.
пример
Ниже приведен пример плохого URI для выборки пользователя.
http://localhost:8080/UserManagement/rest/UserService/getUser/1
Ниже приведен пример хорошего URI для выборки пользователя.
http://localhost:8080/UserManagement/rest/UserService/users/1
Веб-сервисы RESTful — Методы
Как мы уже обсуждали в предыдущих главах, веб-служба RESTful использует множество HTTP-глаголов для определения операции, которая должна быть выполнена с указанными ресурсами. В следующей таблице приведены примеры наиболее часто используемых HTTP-глаголов.
Sr.No. | HTTP-метод, URI и операция |
---|---|
1 |
ПОЛУЧИТЬ HTTP: // локальный: 8080 / UserManagement / отдых / UserService / пользователей Получает список пользователей. (Только чтение) |
2 |
ПОЛУЧИТЬ HTTP: // локальный: 8080 / UserManagement / отдых / UserService / пользователей / 1 Получает пользователя Id 1 (Только чтение) |
3 |
ПОЛОЖИЛ HTTP: // локальный: 8080 / UserManagement / отдых / UserService / пользователей / 2 Вставляет пользователя с идентификатором 2 (Идемпотентный) |
4 |
СООБЩЕНИЕ HTTP: // локальный: 8080 / UserManagement / отдых / UserService / пользователей / 2 Обновляет пользователя с идентификатором 2 (N / A) |
5 |
УДАЛЯТЬ HTTP: // локальный: 8080 / UserManagement / отдых / UserService / пользователей / 1 Удаляет пользователя с идентификатором 1 (Идемпотентный) |
6 |
ОПЦИИ HTTP: // локальный: 8080 / UserManagement / отдых / UserService / пользователей Перечисляет поддерживаемые операции в веб-сервисе. (Только чтение) |
7 |
ГОЛОВА HTTP: // локальный: 8080 / UserManagement / отдых / UserService / пользователей Возвращает только заголовок HTTP, без тела. (Только чтение) |
ПОЛУЧИТЬ
HTTP: // локальный: 8080 / UserManagement / отдых / UserService / пользователей
Получает список пользователей.
(Только чтение)
2
ПОЛУЧИТЬ
HTTP: // локальный: 8080 / UserManagement / отдых / UserService / пользователей / 1
Получает пользователя Id 1
(Только чтение)
3
ПОЛОЖИЛ
HTTP: // локальный: 8080 / UserManagement / отдых / UserService / пользователей / 2
Вставляет пользователя с идентификатором 2
(Идемпотентный)
4
СООБЩЕНИЕ
HTTP: // локальный: 8080 / UserManagement / отдых / UserService / пользователей / 2
Обновляет пользователя с идентификатором 2
(N / A)
5
УДАЛЯТЬ
HTTP: // локальный: 8080 / UserManagement / отдых / UserService / пользователей / 1
Удаляет пользователя с идентификатором 1
(Идемпотентный)
6
ОПЦИИ
HTTP: // локальный: 8080 / UserManagement / отдых / UserService / пользователей
Перечисляет поддерживаемые операции в веб-сервисе.
(Только чтение)
7
ГОЛОВА
HTTP: // локальный: 8080 / UserManagement / отдых / UserService / пользователей
Возвращает только заголовок HTTP, без тела.
(Только чтение)
Следующие пункты должны быть рассмотрены.
-
Операции GET доступны только для чтения и безопасны.
-
Операции PUT и DELETE являются идемпотентными, что означает, что их результат всегда будет одинаковым независимо от того, сколько раз эти операции были вызваны.
-
Операции PUT и POST почти одинаковы, с разницей только в том, что операция PUT идемпотентна, а операция POST может привести к другому результату.
Операции GET доступны только для чтения и безопасны.
Операции PUT и DELETE являются идемпотентными, что означает, что их результат всегда будет одинаковым независимо от того, сколько раз эти операции были вызваны.
Операции PUT и POST почти одинаковы, с разницей только в том, что операция PUT идемпотентна, а операция POST может привести к другому результату.
пример
Давайте обновим пример, созданный в главе «Веб-службы RESTful — первое приложение», чтобы создать веб-службу, которая может выполнять операции CRUD (создание, чтение, обновление, удаление). Для простоты мы использовали файловый ввод / вывод для замены операций базы данных.
Давайте обновим файлы User.java, UserDao.java и UserService.java в пакете com.tutorialspoint.
User.java
package com.tutorialspoint; import java.io.Serializable; import javax.xml.bind.annotation.XmlElement; import javax.xml.bind.annotation.XmlRootElement; @XmlRootElement(name = "user") public class User implements Serializable { private static final long serialVersionUID = 1L; private int id; private String name; private String profession; public User(){} public User(int id, String name, String profession){ this.id = id; this.name = name; this.profession = profession; } public int getId() { return id; } @XmlElement public void setId(int id) { this.id = id; } public String getName() { return name; } @XmlElement public void setName(String name) { this.name = name; } public String getProfession() { return profession; } @XmlElement public void setProfession(String profession) { this.profession = profession; } @Override public boolean equals(Object object){ if(object == null){ return false; }else if(!(object instanceof User)){ return false; }else { User user = (User)object; if(id == user.getId() && name.equals(user.getName()) && profession.equals(user.getProfession())){ return true; } } return false; } }
UserDao.java
package com.tutorialspoint; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; import java.util.ArrayList; import java.util.List; public class UserDao { public List<User> getAllUsers(){ List<User> userList = null; try { File file = new File("Users.dat"); if (!file.exists()) { User user = new User(1, "Mahesh", "Teacher"); userList = new ArrayList<User>(); userList.add(user); saveUserList(userList); } else{ FileInputStream fis = new FileInputStream(file); ObjectInputStream ois = new ObjectInputStream(fis); userList = (List<User>) ois.readObject(); ois.close(); } } catch (IOException e) { e.printStackTrace(); } catch (ClassNotFoundException e) { e.printStackTrace(); } return userList; } public User getUser(int id){ List<User> users = getAllUsers(); for(User user: users){ if(user.getId() == id){ return user; } } return null; } public int addUser(User pUser){ List<User> userList = getAllUsers(); boolean userExists = false; for(User user: userList){ if(user.getId() == pUser.getId()){ userExists = true; break; } } if(!userExists){ userList.add(pUser); saveUserList(userList); return 1; } return 0; } public int updateUser(User pUser){ List<User> userList = getAllUsers(); for(User user: userList){ if(user.getId() == pUser.getId()){ int index = userList.indexOf(user); userList.set(index, pUser); saveUserList(userList); return 1; } } return 0; } public int deleteUser(int id){ List<User> userList = getAllUsers(); for(User user: userList){ if(user.getId() == id){ int index = userList.indexOf(user); userList.remove(index); saveUserList(userList); return 1; } } return 0; } private void saveUserList(List<User> userList){ try { File file = new File("Users.dat"); FileOutputStream fos; fos = new FileOutputStream(file); ObjectOutputStream oos = new ObjectOutputStream(fos); oos.writeObject(userList); oos.close(); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } }
UserService.java
package com.tutorialspoint; import java.io.IOException; import java.util.List; import javax.servlet.http.HttpServletResponse; import javax.ws.rs.Consumes; import javax.ws.rs.DELETE; import javax.ws.rs.FormParam; import javax.ws.rs.GET; import javax.ws.rs.OPTIONS; import javax.ws.rs.POST; import javax.ws.rs.PUT; import javax.ws.rs.Path; import javax.ws.rs.PathParam; import javax.ws.rs.Produces; import javax.ws.rs.core.Context; import javax.ws.rs.core.MediaType; @Path("/UserService") public class UserService { UserDao userDao = new UserDao(); private static final String SUCCESS_RESULT = "<result>success</result>"; private static final String FAILURE_RESULT = "<result>failure</result>"; @GET @Path("/users") @Produces(MediaType.APPLICATION_XML) public List<User> getUsers(){ return userDao.getAllUsers(); } @GET @Path("/users/{userid}") @Produces(MediaType.APPLICATION_XML) public User getUser(@PathParam("userid") int userid){ return userDao.getUser(userid); } @PUT @Path("/users") @Produces(MediaType.APPLICATION_XML) @Consumes(MediaType.APPLICATION_FORM_URLENCODED) public String createUser(@FormParam("id") int id, @FormParam("name") String name, @FormParam("profession") String profession, @Context HttpServletResponse servletResponse) throws IOException{ User user = new User(id, name, profession); int result = userDao.addUser(user); if(result == 1){ return SUCCESS_RESULT; } return FAILURE_RESULT; } @POST @Path("/users") @Produces(MediaType.APPLICATION_XML) @Consumes(MediaType.APPLICATION_FORM_URLENCODED) public String updateUser(@FormParam("id") int id, @FormParam("name") String name, @FormParam("profession") String profession, @Context HttpServletResponse servletResponse) throws IOException{ User user = new User(id, name, profession); int result = userDao.updateUser(user); if(result == 1){ return SUCCESS_RESULT; } return FAILURE_RESULT; } @DELETE @Path("/users/{userid}") @Produces(MediaType.APPLICATION_XML) public String deleteUser(@PathParam("userid") int userid){ int result = userDao.deleteUser(userid); if(result == 1){ return SUCCESS_RESULT; } return FAILURE_RESULT; } @OPTIONS @Path("/users") @Produces(MediaType.APPLICATION_XML) public String getSupportedOperations(){ return "<operations>GET, PUT, POST, DELETE</operations>"; } }
Теперь, используя Eclipse, экспортируйте ваше приложение как файл WAR и разверните его в Tomcat. Чтобы создать файл WAR с использованием Eclipse, следуйте по этому пути — Файл → Экспорт → Web → Файл войны и, наконец, выберите проект UserManagement и папку назначения. Чтобы развернуть файл WAR в Tomcat, поместите файл UserManagement.war в каталог установки Tomcat → каталог webapps и запустите Tomcat.
Тестирование веб-службы
Джерси предоставляет API для создания клиента веб-службы для тестирования веб-служб. Мы создали образец тестового класса WebServiceTester.java в пакете com.tutorialspoint в том же проекте.
WebServiceTester.java
package com.tutorialspoint; import java.util.List; import javax.ws.rs.client.Client; import javax.ws.rs.client.ClientBuilder; import javax.ws.rs.client.Entity; import javax.ws.rs.core.Form; import javax.ws.rs.core.GenericType; import javax.ws.rs.core.MediaType; public class WebServiceTester { private Client client; private String REST_SERVICE_URL = " http://localhost:8080/UserManagement/rest/UserService/users"; private static final String SUCCESS_RESULT = "<result>success</result>"; private static final String PASS = "pass"; private static final String FAIL = "fail"; private void init(){ this.client = ClientBuilder.newClient(); } public static void main(String[] args){ WebServiceTester tester = new WebServiceTester(); //initialize the tester tester.init(); //test get all users Web Service Method tester.testGetAllUsers(); //test get user Web Service Method tester.testGetUser(); //test update user Web Service Method tester.testUpdateUser(); //test add user Web Service Method tester.testAddUser(); //test delete user Web Service Method tester.testDeleteUser(); } //Test: Get list of all users //Test: Check if list is not empty private void testGetAllUsers(){ GenericType<List<User>> list = new GenericType<List<User>>() {}; List<User> users = client .target(REST_SERVICE_URL) .request(MediaType.APPLICATION_XML) .get(list); String result = PASS; if(users.isEmpty()){ result = FAIL; } System.out.println("Test case name: testGetAllUsers, Result: " + result ); } //Test: Get User of id 1 //Test: Check if user is same as sample user private void testGetUser(){ User sampleUser = new User(); sampleUser.setId(1); User user = client .target(REST_SERVICE_URL) .path("/{userid}") .resolveTemplate("userid", 1) .request(MediaType.APPLICATION_XML) .get(User.class); String result = FAIL; if(sampleUser != null && sampleUser.getId() == user.getId()){ result = PASS; } System.out.println("Test case name: testGetUser, Result: " + result ); } //Test: Update User of id 1 //Test: Check if result is success XML. private void testUpdateUser(){ Form form = new Form(); form.param("id", "1"); form.param("name", "suresh"); form.param("profession", "clerk"); String callResult = client .target(REST_SERVICE_URL) .request(MediaType.APPLICATION_XML) .post(Entity.entity(form, MediaType.APPLICATION_FORM_URLENCODED_TYPE), String.class); String result = PASS; if(!SUCCESS_RESULT.equals(callResult)){ result = FAIL; } System.out.println("Test case name: testUpdateUser, Result: " + result); } //Test: Add User of id 2 //Test: Check if result is success XML. private void testAddUser(){ Form form = new Form(); form.param("id", "2"); form.param("name", "naresh"); form.param("profession", "clerk"); String callResult = client .target(REST_SERVICE_URL) .request(MediaType.APPLICATION_XML) .put(Entity.entity(form, MediaType.APPLICATION_FORM_URLENCODED_TYPE), String.class); String result = PASS; if(!SUCCESS_RESULT.equals(callResult)){ result = FAIL; } System.out.println("Test case name: testAddUser, Result: " + result ); } //Test: Delete User of id 2 //Test: Check if result is success XML. private void testDeleteUser(){ String callResult = client .target(REST_SERVICE_URL) .path("/{userid}") .resolveTemplate("userid", 2) .request(MediaType.APPLICATION_XML) .delete(String.class); String result = PASS; if(!SUCCESS_RESULT.equals(callResult)){ result = FAIL; } System.out.println("Test case name: testDeleteUser, Result: " + result); } }
Теперь запустите тестер, используя Eclipse. Щелкните правой кнопкой мыши по файлу и выберите « Запуск от имени» → «Java-приложение» . Вы увидите следующий результат в консоли Eclipse —
Test case name: testGetAllUsers, Result: pass Test case name: testGetUser, Result: pass Test case name: testUpdateUser, Result: pass Test case name: testAddUser, Result: pass Test case name: testDeleteUser, Result: pass
Веб-сервисы RESTful — Безгражданство
Согласно архитектуре REST, веб-служба RESTful не должна сохранять состояние клиента на сервере. Это ограничение называется безгражданством. Клиент несет ответственность за передачу своего контекста на сервер, а затем сервер может сохранить этот контекст для обработки дальнейшего запроса клиента. Например, сеанс, поддерживаемый сервером, идентифицируется идентификатором сеанса, переданным клиентом.
Веб-службы RESTful должны придерживаться этого ограничения. В главе RESTful Web Services — Methods мы увидели, что методы web-сервиса не хранят никакой информации от клиента, с которого они вызваны.
Рассмотрим следующий URL —
https: // локальный: 8080 / UserManagement / отдых / UserService / пользователей / 1
Если вы нажмете указанную выше ссылку с помощью браузера или с помощью клиента на основе Java или с помощью Postman, результатом всегда будет пользовательский XML, идентификатор которого равен 1, поскольку сервер не хранит никакой информации о клиенте.
<user> <id>1</id> <name>mahesh</name> <profession>1</profession> </user>
Преимущества безгражданства
Ниже приведены преимущества безгражданства в веб-службах RESTful.
-
Веб-сервисы могут обрабатывать каждый запрос метода независимо.
-
Веб-сервисы не должны поддерживать предыдущие взаимодействия клиента. Это упрощает дизайн приложения.
-
Поскольку HTTP сам по себе является протоколом без сохранения состояния, веб-службы RESTful без проблем работают с протоколами HTTP.
Веб-сервисы могут обрабатывать каждый запрос метода независимо.
Веб-сервисы не должны поддерживать предыдущие взаимодействия клиента. Это упрощает дизайн приложения.
Поскольку HTTP сам по себе является протоколом без сохранения состояния, веб-службы RESTful без проблем работают с протоколами HTTP.
Недостатки безгражданства
Ниже приведены недостатки безгражданства в веб-сервисах RESTful.
-
Веб-сервисы должны получать дополнительную информацию в каждом запросе, а затем интерпретировать, чтобы получить состояние клиента в случае необходимости взаимодействия с клиентом.
Веб-сервисы должны получать дополнительную информацию в каждом запросе, а затем интерпретировать, чтобы получить состояние клиента в случае необходимости взаимодействия с клиентом.
Веб-службы RESTful — Кэширование
Кэширование относится к хранению ответа сервера в самом клиенте, поэтому клиенту не нужно снова и снова запрашивать у сервера один и тот же ресурс. Ответ сервера должен содержать информацию о том, как должно выполняться кэширование, чтобы клиент кэшировал ответ в течение определенного периода времени или никогда не кэшировал ответ сервера.
Ниже приведены заголовки, которые может иметь ответ сервера для настройки кэширования клиента.
Sr.No. | Заголовок и описание |
---|---|
1 |
Дата Дата и время ресурса, когда он был создан. |
2 |
Последнее изменение Дата и время ресурса, когда он был последний раз изменен. |
3 |
Cache-Control Основной заголовок для управления кэшированием. |
4 |
Истекает Срок годности и время кеширования. |
5 |
Возраст Продолжительность в секундах с момента получения ресурса с сервера. |
1
Дата
Дата и время ресурса, когда он был создан.
2
Последнее изменение
Дата и время ресурса, когда он был последний раз изменен.
3
Cache-Control
Основной заголовок для управления кэшированием.
4
Истекает
Срок годности и время кеширования.
5
Возраст
Продолжительность в секундах с момента получения ресурса с сервера.
Заголовок Cache-Control
Ниже приведены подробности заголовка Cache-Control.
Sr.No. | Директива и описание |
---|---|
1 |
общественного Указывает, что ресурс кэшируется любым компонентом. |
2 |
Частный Указывает, что ресурс кешируется только клиентом и сервером, никакой посредник не может кешировать ресурс. |
3 |
нет нет кэша / нет-магазина Указывает, что ресурс не кэшируется. |
4 |
максимальный возраст Указывает, что кэширование действует до максимального возраста в секундах. После этого клиент должен сделать еще один запрос. |
5 |
обязательно перепроверить Указание серверу на повторную проверку ресурса, если максимальный возраст прошел. |
1
общественного
Указывает, что ресурс кэшируется любым компонентом.
2
Частный
Указывает, что ресурс кешируется только клиентом и сервером, никакой посредник не может кешировать ресурс.
3
нет нет кэша / нет-магазина
Указывает, что ресурс не кэшируется.
4
максимальный возраст
Указывает, что кэширование действует до максимального возраста в секундах. После этого клиент должен сделать еще один запрос.
5
обязательно перепроверить
Указание серверу на повторную проверку ресурса, если максимальный возраст прошел.
Лучшие практики
-
Всегда сохраняйте статическое содержимое, такое как изображения, CSS, JavaScript, кешируемое, со сроком действия от 2 до 3 дней.
-
Никогда не держите срок годности слишком высоким.
-
Динамический контент должен кэшироваться только на несколько часов.
Всегда сохраняйте статическое содержимое, такое как изображения, CSS, JavaScript, кешируемое, со сроком действия от 2 до 3 дней.
Никогда не держите срок годности слишком высоким.
Динамический контент должен кэшироваться только на несколько часов.
Веб-сервисы RESTful — Безопасность
Поскольку веб-службы RESTful работают с путями URL-адресов HTTP, очень важно защитить веб-службу RESTful так же, как защищен веб-сайт.
Ниже приведены рекомендации, которых следует придерживаться при разработке веб-службы RESTful.
-
Проверка — проверка всех входных данных на сервере. Защитите свой сервер от атак SQL или NoSQL.
-
Аутентификация на основе сеансов — используйте аутентификацию на основе сеансов для аутентификации пользователя при каждом обращении к методу веб-службы.
-
В URL нет конфиденциальных данных — Никогда не используйте имя пользователя, пароль или токен сеанса в URL, эти значения должны передаваться в веб-службу с помощью метода POST.
-
Ограничение на выполнение метода — разрешить ограниченное использование таких методов, как методы GET, POST и DELETE. Метод GET не должен быть в состоянии удалить данные.
-
Проверка неверного XML / JSON — проверка правильности ввода, переданного методу веб-службы.
-
Создавайте общие сообщения об ошибках. Метод веб-службы должен использовать сообщения об ошибках HTTP, например, 403, для отображения запрещенного доступа и т. Д.
Проверка — проверка всех входных данных на сервере. Защитите свой сервер от атак SQL или NoSQL.
Аутентификация на основе сеансов — используйте аутентификацию на основе сеансов для аутентификации пользователя при каждом обращении к методу веб-службы.
В URL нет конфиденциальных данных — Никогда не используйте имя пользователя, пароль или токен сеанса в URL, эти значения должны передаваться в веб-службу с помощью метода POST.
Ограничение на выполнение метода — разрешить ограниченное использование таких методов, как методы GET, POST и DELETE. Метод GET не должен быть в состоянии удалить данные.
Проверка неверного XML / JSON — проверка правильности ввода, переданного методу веб-службы.
Создавайте общие сообщения об ошибках. Метод веб-службы должен использовать сообщения об ошибках HTTP, например, 403, для отображения запрещенного доступа и т. Д.
HTTP код
Sr.No. | HTTP код и описание |
---|---|
1 |
200 ОК — показывает успех. |
2 |
201 CREATED — когда ресурс успешно создан с использованием запроса POST или PUT. Возвращает ссылку на вновь созданный ресурс, используя заголовок местоположения. |
3 |
204 NO CONTENT — когда тело ответа пусто. Например, запрос DELETE. |
4 |
304 НЕ ИЗМЕНЕНО — используется для уменьшения использования пропускной способности сети в случае условных запросов GET. Тело ответа должно быть пустым. Заголовки должны иметь дату, местоположение и т. Д. |
5 |
400 BAD REQUEST — указывает, что введен неверный ввод. Например, ошибка проверки, отсутствующие данные. |
6 |
401 UNAUTHORIZED — указывает, что пользователь использует неверный или неправильный токен аутентификации. |
7 |
403 ЗАПРЕЩЕНО — указывает, что у пользователя нет доступа к используемому методу. Например, Удалить доступ без прав администратора. |
8 |
404 НЕ НАЙДЕН — заявляет, что метод недоступен. |
9 |
409 CONFLICT — констатирует конфликтную ситуацию при выполнении метода. Например, добавление повторяющейся записи. |
10 |
500 ВНУТРЕННЯЯ ОШИБКА СЕРВЕРА — указывает, что при выполнении метода сервер выдал исключение. |
1
200
ОК — показывает успех.
2
201
CREATED — когда ресурс успешно создан с использованием запроса POST или PUT. Возвращает ссылку на вновь созданный ресурс, используя заголовок местоположения.
3
204
NO CONTENT — когда тело ответа пусто. Например, запрос DELETE.
4
304
НЕ ИЗМЕНЕНО — используется для уменьшения использования пропускной способности сети в случае условных запросов GET. Тело ответа должно быть пустым. Заголовки должны иметь дату, местоположение и т. Д.
5
400
BAD REQUEST — указывает, что введен неверный ввод. Например, ошибка проверки, отсутствующие данные.
6
401
UNAUTHORIZED — указывает, что пользователь использует неверный или неправильный токен аутентификации.
7
403
ЗАПРЕЩЕНО — указывает, что у пользователя нет доступа к используемому методу. Например, Удалить доступ без прав администратора.
8
404
НЕ НАЙДЕН — заявляет, что метод недоступен.
9
409
CONFLICT — констатирует конфликтную ситуацию при выполнении метода. Например, добавление повторяющейся записи.
10
500
ВНУТРЕННЯЯ ОШИБКА СЕРВЕРА — указывает, что при выполнении метода сервер выдал исключение.
Веб-службы RESTful — Java (JAX-RS)
JAX-RS расшифровывается как JAVA API для RESTful Web Services. JAX-RS — это API-интерфейс и спецификация языка программирования на основе JAVA, обеспечивающие поддержку созданных веб-служб RESTful. Его версия 2.0 была выпущена 24 мая 2013 года. JAX-RS использует аннотации, доступные в Java SE 5, чтобы упростить разработку создания и развертывания веб-сервисов на основе JAVA. Он также поддерживает создание клиентов для веб-служб RESTful.
Характеристики
Ниже приведены наиболее часто используемые аннотации для сопоставления ресурса как ресурса веб-службы.
Sr.No. | Аннотация и описание |
---|---|
1 |
@Дорожка Относительный путь класса / метода ресурса. |
2 |
@ПОЛУЧИТЬ HTTP Get request, используется для получения ресурса. |
3 |
@ПОЛОЖИЛ HTTP PUT-запрос, используемый для создания ресурса. |
4 |
@СООБЩЕНИЕ HTTP POST-запрос, используемый для создания / обновления ресурса. |
5 |
@УДАЛЯТЬ HTTP-запрос DELETE, используемый для удаления ресурса. |
6 |
@ГОЛОВА HTTP HEAD запрос, используется для получения статуса доступности метода. |
7 |
@Produces Устанавливает HTTP-ответ, сгенерированный веб-службой. Например, APPLICATION / XML, TEXT / HTML, APPLICATION / JSON и т. Д. |
8 |
@Consumes Устанавливает тип HTTP-запроса. Например, application / x-www-formurlen закодирован для принятия данных формы в теле HTTP во время запроса POST. |
9 |
@PathParam Связывает параметр, переданный методу, со значением в пути. |
10 |
@QueryParam Связывает параметр, переданный методу, с параметром запроса в пути. |
11 |
@MatrixParam Связывает параметр, переданный методу, с параметром матрицы HTTP в пути. |
12 |
@HeaderParam Связывает параметр, переданный методу, с заголовком HTTP. |
13 |
@CookieParam Связывает параметр, переданный методу, с файлом cookie. |
14 |
@FormParam Связывает параметр, переданный методу, со значением формы. |
15 |
@Значение по умолчанию Назначает значение по умолчанию для параметра, передаваемого методу. |
16 |
@Context Контекст ресурса. Например, HTTPRequest в качестве контекста. |
1
@Дорожка
Относительный путь класса / метода ресурса.
2
@ПОЛУЧИТЬ
HTTP Get request, используется для получения ресурса.
3
@ПОЛОЖИЛ
HTTP PUT-запрос, используемый для создания ресурса.
4
@СООБЩЕНИЕ
HTTP POST-запрос, используемый для создания / обновления ресурса.
5
@УДАЛЯТЬ
HTTP-запрос DELETE, используемый для удаления ресурса.
6
@ГОЛОВА
HTTP HEAD запрос, используется для получения статуса доступности метода.
7
@Produces
Устанавливает HTTP-ответ, сгенерированный веб-службой. Например, APPLICATION / XML, TEXT / HTML, APPLICATION / JSON и т. Д.
8
@Consumes
Устанавливает тип HTTP-запроса. Например, application / x-www-formurlen закодирован для принятия данных формы в теле HTTP во время запроса POST.
9
@PathParam
Связывает параметр, переданный методу, со значением в пути.
10
@QueryParam
Связывает параметр, переданный методу, с параметром запроса в пути.
11
@MatrixParam
Связывает параметр, переданный методу, с параметром матрицы HTTP в пути.
12
@HeaderParam
Связывает параметр, переданный методу, с заголовком HTTP.
13
@CookieParam
Связывает параметр, переданный методу, с файлом cookie.
14
@FormParam
Связывает параметр, переданный методу, со значением формы.
15
@Значение по умолчанию
Назначает значение по умолчанию для параметра, передаваемого методу.
16
@Context
Контекст ресурса. Например, HTTPRequest в качестве контекста.
Примечание. Мы использовали Jersey, эталонную реализацию JAX-RS 2.0 от Oracle, в главах RESTful Web Services — First Application и RESTful Web Services — Methods .