Учебники

Веб-службы RESTful — Краткое руководство

Веб-сервисы 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 

После успешного запуска, если все в порядке, на вашем экране должен появиться следующий результат —

Eclipse Home Page

Установка библиотек 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, как показано на следующем скриншоте.

Справочник Jaxrs

Вы найдете все библиотеки Джерси в каталогах 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 API, Все пользователи

Поздравляем, вы успешно создали свое первое приложение 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-запрос состоит из пяти основных частей —

  • Глагол — указывает методы 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-ответ

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. Если вы нажмете кнопку «Просмотр», которая находится рядом с кнопкой «Отправить», а затем нажмите кнопку «Отправить», вы можете увидеть следующий вывод.

HTTP-запрос / ответ

Здесь вы можете видеть, что браузер отправил запрос 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 дней.

Никогда не держите срок годности слишком высоким.

Динамический контент должен кэшироваться только на несколько часов.

Лучшие практики для Cache-Control

Веб-сервисы 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 .