betacode

Что такое RESTful Web Service?

  1. Web vs Web Service
  2. Что такое RESTful Service?
  3. Использовать методы HTTP явно
  4. Без состояния (Stateless)
  5. Выставлять структуру папки схожие с URI
  6. Передача XML, JSON или оба
  7. Java RESTful Service для начинающих

1. Web vs Web Service

Прежде чем ответить на вопрос про RESTful я хочу, чтобы вы различали между веб и веб сервисом.
Когда вы вводите URL в браузер и получаете вебсайт. Это обычное содержание, которое вы можете прочитать, это содержание для конечного пользователя.
При этом, Web Service это веб сервис, являющееся понятием более расширенным по сравнению с понятием обычного веб, он предоставляет необработанную информацию, и сложен для большинства пользователей. Поэтому он используется приложениями. Эти приложения анализируют данные перед тем как вернуть их конечному пользователю.
Например вы можете зайти на веб страницу ABC, чтобы посмотреть информацию про прогноз погоды и акции. Эта страница отобразит нужную вам информацию.

Чтобы получить данные прогноза погоды, приложению ABC нужно взять информацию из определенного ресурса? это может веб сервис, который предоставляет данные погоды соответсвтующие разным регионам.

Индентично, чтобы получить данные про акции, приложение ABC тоже должно связать с веб сервисом предоставляющим эти данные. Данные будут обработаны перед тем как вернуть вам полный вебсайт.
Web Service часто предоставляют необработанные данные, которые сложно понять большинству обычных пользователей, они обычно возвращаются в формате XML или JSON.

2. Что такое RESTful Service?

RESTful Web Service это Web Service написан на основании структуры REST. REST уже широко используется и заменяет Web Service основываясь на SOAP и WSDL. RESTful Web Service легкий (lightweigh), легко расширить и поддерживать.
Первые понятия про REST (REpresentational State Transfer) были введены в 2000 году в докторской диссертации Roy Thomas Fielding (соучредитель HTTP). В диссертации он детально знакомит с ограничениями, правилами, как и со способами выполнения в системе для получения системы REST.
REST определяет правила архитектуры для дизайна ваших Web services, фокусируется на систематических ресурсах, включая какого формата состояние ресурсов и передается по HTTP, и написан разными языками. Если посчитать по количеству использующих веб сервисов, REST стал популярным за прошедшие годы как сервис модели дизайна с преимуществом. На самом деле, REST имеет большое влияние и почти заменил SOAP и WSDL так как его намного проще и легче использовать.
REST это набор правил для создания приложения Web Service, который следует 4 основным правилам дизайна:
  • Использовать явные методы HTTP
  • Не имеет состояния
  • Отображает структуру папок как URls
  • Передача JavaScript Object Notation (JSON), XML или обоих.
В слове RESTful,то ful является суффиксом (suffix) в английском языке, похоже на слово help означающий помощь, то слово helpful это полезный.

3. Использовать методы HTTP явно

REST ставит правило, требующее проммистов определить их цель через метод HTTP. Обычно эти цели включают получение данных, вставить данные, обновление данных или удаление данных. Поэтому когда вы хотите выполнить одну из задач выше, заметьте следующие правила:
  • Чтобы создать ресурс на сервере, вам нужно использовать метод POST.
  • Для получения ресурса, используйте GET.
  • Чтобы поменять состояние ресурса или обновить его, используйте PUT.
  • Чтобы отменить или удалить ресурс, используйте DELETE.
Заметьте, что правила выше необязательны, на самом деле вы можете метод GET чтобы получить данные, вставлять, менять или удалять данные на Сервере. Но REST дает правила выше которые нацелены все прояснить и объяснить.

Пример ниже это как вы используете GET чтобы получить больше данных на сервере (Заметьте это обратно правилу REST).
Используйте GET чтобы запросить добавочного пользователя с именем Robert.
GET /adduser?name=Robert HTTP/1.1
Используйте GET чтобы запросить сервер переименовать пользователя с именем Robert в Smith.
GET /updateuser?name=Robert&newname=Smith HTTP/1.1
И теперь по правилу REST все стало понятней.
Отправить запрос HTTP POST чтобы добавить данные:
POST /users/Robert HTTP/1.1
Host: myserver
Content-Type: application/xml
<?xml version="1.0"?>
<user>
<name>Robert</name>
</user>
Отправим запрос GET если вы хотите получить данные в системе.
GET /users/Robert HTTP/1.1
Host: myserver
Accept: application/xml
Отправим запрос PUT если вы хотите обновить данные.
PUT /users/Robert HTTP/1.1
Host: myserver
Content-Type: application/xml
<?xml version="1.0"?>
<user>
 <name>Smith</name>
</user>
Отправим запрос DELETE если вы хотите удалить данные:
DELETE /users/Robert HTTP/1.1

4. Без состояния (Stateless)

Одно из свойств REST это быть без состояния (stateless), то есть он не хранит информацию клиента. Например вы отправляете запрос, чтобы посмотреть 2 страницу документа, и терерь вы хотите посмотреть следующую страницу (страницу 3). REST не хранит информацию о том, что он давал вам страницу 2. Это означает REST не управляет сессией (Session).
Картина ниже изображает приложение хранящее состояние, оно знает какую страницу просматривал пользователь. И пользователю нужно только запросить "Следующую страницу" чтобы получить желаемую страницу.
С дизайнами у которых нет состояния, Клиент должен отправить ясный запрос, включая номер порядка просматриваемой страницы.
Поэтому, компоненты сервера без состояния сложнее для дизайна, написания и распределения через сбалансированный сервер. Сервис состояния не только работает лучше, но и перемещает по большому счету роль сохранения состояния на приложение пользователя. В веб сервисе RESTful, сервер несет ответствуенность за генерирование ответов и предоставляет метод позволяющий клиенту сохранять состояние собственного приложения.

5. Выставлять структуру папки схожие с URI

REST дает структуру чтобы пользователь мог иметь доступ в собственные ресурсы через URL. Ресурсы здесь является всем, что вы можете назвать (Видео, фото, отчет погоды,...)
Вам нужно создать REST serivce чтобы он вернул пользователю соответствующие ресурсы.
Ссылки REST service должны быть интуитивными, чтобы пользователи могли легко угадать. Подумайте про ссылку (URI) как про ясную подсказку, которую легко можно угадать, куда она ведет и какие ресурсы предоставляет. Вкратце, структуре URI следует быть простой, легко угадать и понять.
Посмотрим на URL ниже, она предоставляет информацию погоды соответствующего региона для определенного дня, понятна пользователю.
http://myservice.com/weather/chicago/2016-09-27

http://myservice.com/weather/hanoi/2016-11-11
Некоторые добавочные правила на заметку про структуру ссылки RESTful Web service это:
  • Скрыть окончания расширенных файлов оригинала в сервере (.jsp, .php, .asp), если есть, поэтому вы можете скрыть некоторые вещи не меняя Urls.
  • Оставить все строчными буквами.
  • Заменить пробелы дефисами или нижней чертой (одно из двух).
  • Избегать строки запроса как можно больше
  • Вместо использования кода (404 Not Found) если запрос URI это для частичной ссылки, всегда предоставляйте страницу по умолчанию или ресурс как ответ.

6. Передача XML, JSON или оба

When the Client sends a request to the web service, it is often transmitted in XML or JSON and often gets similar forms back.
Иногда Клиет может определить виды возвращенных данных, которые он хочет (JSON, или XML,..), эти определения называются видами MINE, который прикреплен к HEADER запроса.

Ниже перечислены распространенные виды MINE использующиеся с REST service.
JSON
application/json
XML
application/xml
XHTML
application/xhtml+xml
Например Клиент отправляет запрос на получение информации про погоду, и требует возвратные данные в формате XML.
GET /weather/chicago/2016-08-27 HTTP/1.1
Host: myservice.com
Accept: application/xml;q=0.5
Полученные данные:
<weather>
    <date>2016-08-27</date>
    <location>Chicago</location>
    <info>Hot</info>"//
</weather>
В случае клиент требует возвращенные данные в формате JSON:
{
 "date": "2016-08-27",
 "location": "Chicago",
 "info": "Hot"
}