Разное

Service rest: Архитектура REST / Хабр

Содержание

что это такое, примеры запросов, Restful для чайников, интерфейс, разработка, примеры использования сервиса

В этой статье мы разберем оболочку REST API, расскажем, что это такое простыми словами, как работает система.

Так называется способ взаимодействия и обмена данными сервера, своеобразная оболочка, если коротко. Большинство серьезных компаний разрабатывают для внутреннего использования или для своих клиентов этот интерфейс, ведь он способен обеспечить общение между двумя системами и предоставлять информацию. Это небольшая шестеренка, которая приводит в движение другие. Сейчас этот подход сумел вытеснить практически все остальные, включая дизайны, которые были основаны на SOAP.

Что такое REST API

Так называют сокращение английской аббревиатуры, которая переводится как передача состояния представления. Web-службы, которые пользуются этой системой, применяют термин RESTful. Единого стандарта у нее нет — не протокол, а целый архитектурный стиль. Этим она отличается от многих аналогичных. При этом допустимо использовать XML, HTTP, JSON и URL.

Ее разработали еще в 2000 году, но с того момента она очень развилась и сейчас стала одной из самых популярных, отодвинув на задний план аналогичные.

Чтобы объяснить суть restful api для чайников, можно представить калькулятор на любом компьютере. Когда мы нажимаем на кнопки, желая получить расчеты, скрытые функции начинают взаимодействовать. А когда сервис получает результат, он выводит его на экран в виде готовой цифры в графическом интерфейсе.

Здесь архитектура работает аналогичным образом. При нажатии на кнопку выполняются разные операции, чтобы обработать и передать информацию. Они могут не просто получать данные из одной сети, а способны вызывать и обращаться к удаленным серверам, чтобы взять нужное у них.

В качестве примера стоит привести кнопку Facebook, которая умеет задействовать соцсеть, или видео на Youtube, его тоже запускает веб-версия API.

Как работает

В первую очередь стоит разобраться, как действует подход. Преимущества:

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

Суть оболочки заключается в паре действий, в зависимости от типа запроса. От работы сервера зависит функционал и способности архитектуры. Есть 4 основных вида в отношении информации:

  • get — получение, просто передача;
  • delete — удаление, в дальнейшем они не отражаются;
  • post — регистрация или добавление, регистрация;
  • update — обновление, регулярная операция, базы становятся актуальными и свежими.

В качестве пакета обычно отправляется JSON массив на указанный конкретный URL. Там срабатывает так называемая функция, а в зависимости от уже отправленных данных и текущего запроса начинается определенное действие.

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

Что такое API

Вокруг этого объяснения много споров, потому как он:

  • не спецификация — может видоизменяться;
  • не протокол — не относится к ним;
  • не HTTP — слишком отличается.

Поэтому столько вопросов. Так что же это? Это своеобразная созданная человеком архитектура, которая создается с помощью ограничений и расширений. Если их использовать, то мы получаем стиль, который оптимизировали под пожелания, и подходящий для основных случаев, когда может понадобиться.

В его задачи входит представлять состояние передачи. Уже из названия становится понятно, как должно работать хорошо разработанный софт. Даже сеть страниц можно рассматривать, как машину состояний:

  • пользователь видит первое индексное сообщение;
  • переходит при помощи ПО, нажимая на ссылку;
  • результат он обнаруживает на экране.

Протокол по типу концентрированного REST API, работающий по HTTP равно качественным веб-сервисам

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

Те варианты, которые применяются для транслирования, тоже можно учитывать как «веб-сервисы». Клиент, который пользуется этим, способен запросить все что угодно, а сервер ему отвечает и предоставляет результаты. Задействуют любой удобный язык программирования или подходящие платформы. Не имеет никакого значения, какой конкретно использовался, так как все выполняется через общий тип.

Это вообще лучшая часть всего созданного в компьютерном мире. Так как они не зависят от языков, то могут совмещаться с самыми разными системами. Когда API документируется, то неважно, чем пользовались разработчики при его создании — Ruby это был, Java или Python или что-то принципиально другое. Все запросы высылаются через один и тот же HTTP, решения приходят таким же способом.

Хотите внедрить «Склад 15»?

Получите всю необходимую информацию у специалиста.

Спасибо!
Спасибо, ваша заявка принята!
Продолжить

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

SOAP стоит отнести к предкам интерфейсов по типу REST API

Еще перед тем, как прикладное программирование нового поколения стало популярным и везде используемым, у него был аналог — SOAP. Он был максимально распространен. А чтобы понять разницу, стоит разобраться в истоках.

SOAP это протокол, который работает по заранее определенному стандарту. Ему для работы требуется XML, это определит формат, в котором будут отражаться входящие и исходящие запросы. Так как это стандартная вещь, подвид можно определить, если использовать файл WSDL — он помогает расшифровывать язык, на котором пишут веб-службы. Он определяет, есть ли атрибуты или какие-то расширенные элементы в передающихся сообщениях. Это машиночитаемая часть функционирования сети, поэтому пользуются им только сервера, которые действуют и общаются, чтобы облегчить связь.

Все сообщения внутри SOAP собираются в своеобразные «конвертики», в которых есть заголовок и основное тело. Все это «пакуется» при помощи заранее сформированной схемы по принципу XML.

Основная проблема этой системы в том, что формат, который используется для передачи, излишне тяжелый. Это вызывает серьезные проблемы в выполняемых сценариях на мобильных устройствах, задерживает загрузку, делает слишком медленной обработку. Там, где пропускная способность очень важна, эту схему не хочется использовать. Это одна из причин, которые стали поводом для разработки и создания rest сервиса.

Самый короткий обзор HTTP

Начать это изучение стоит с открытия любого браузера и веб-страницы. Можно ввести запрос и внизу появятся результаты. Нужно щелкнуть по любому из вариантов, ПО переведет на страницу. Если есть ссылки, то можно кликнуть по ним, это отправит пользователя на следующую веб-страничку.

Именно так обычно выглядит просматривание ресурсов. Но в этот момент происходит очень много вещей, не видимых глазу клиента. В эти минуты между браузером и хабом происходит много всего. Создается и отправляется требование к посещаемому сайту, оттуда приходит ответ.

Как протоколируется HTTP

Когда вводится определенный адрес, то на относящийся к нему медиасервер высылается сгенерированный вопрос. Там формируется результат и через доли секунды высылается. Важно учесть, в каком виде будут создаваться и переправляться эти пакеты. Обычно они определяются одним этим протоколом.

Когда набирается в браузере URL, то он высылает запрос GET на тот веб-сайт, который относится к введенному. Система отвечает также, с содержанием HTML, который читает код и отражает на экране.

Например, заполняется форма на веб-странице, где есть целый перечень элементов, в который необходимо вписывать данные. Когда все поля заняты, клиент нажимает на кнопку «Отправить», требование отправляется на хаб.

Веб-сервисы порядка HTTP и RESTful

С помощью Hyper Text Transfer Protocol можно обеспечить минимальный уровень для создания разнообразных по функционалу медиасервисов. Поэтому необходимо понимать, как это работает.

Все основывается на абстракциях:

  • Ресурс. Ключевое концентрирующее понятие. Это все, что пользователь желает показать сквозь себя.
  • URI. Для каждого хаба разрабатываются свои системы. Чтобы идентифицировать какую-то из них для отображения, ему следует присвоить универсальный идентификатор.
  • Компоненты. У каждого есть собственная структура, которой необходимо придерживаться. Обычно это строка, которая может определить тип сообщения, заголовки и само тело.

А теперь давайте остановимся на этом подробнее.

Ресурс приложения

Абстракция, на которой концентрируется рабочий протокол HTTP. Так разработчик составляет то, что хочет транслировать миру через создаваемое. К примеру, если готовится модель, в которой можно управлять задачами, ресурсная составляющая складывается из определенных пользователей, их целей и списка того, что должно выполниться.

Объяснение URI

Вне зависимости от цели софта, это последовательность, определяющая конкретный физическое или абстрактное ПО. Кроме того, рекомендуется определить и отделить ее от аналогичных полей, которые планируется представлять публике. Необходимо выбрать конкретный способ. А потом каждому сайту прикрепляется URI — это уникальный идентификатор. О том, какие команды для этого выполняются, мы уже говорили выше.

REST с точки зрения ресурсов

Если используется этот вид представления, нужно думать о приложении с позиции ресурсной составляющей. Следует определить, какие из них хотелось бы показать внешнему миру и другим пользователям. Когда будут выбраны части, подгоняемые под протокол, предстоит использовать глаголы для осуществления операций, где будут задействованы эти процедуры.

Служба реализуется таким образом:

  • В каком варианте осуществляется обмен. В нем определены ограничения. Из популярных можно выделить JSON, но никто не запрещает задействовать и другие, например, XML.
  • Чем обеспечена трансляция. Все пакеты транспортируются на HTTP, REST всегда построен на нем.
  • Как определяется сервис. В этой позиции нет единого стандарта, архитектура гибкая и подстраиваемая. В отдельных сценариях это оказывается довольно серьезным недостатком. Дело в том, что может потребоваться возможность разбираться в форматах, в которых отправляются запросы и ответы. Но чаще всего это удобный механизм, где широко задействованы языки программирования веб-приложений и сайтов.

Структура компонентов HTTP

Веб-сайты, построенные на rest api example, строятся по конкретной структурной схеме. Что у него есть:

  • строка — в нем определяется тип, которым транслируется сообщение;
  • заголовок — характеризует, как выглядит тело будущего текста, с какими параметрами планируется передавать пакет данных и другие важные сведения;
  • само сообщение — это необязательное поле, его допускается пропускать.

Методы текущих запросов

То, что используется в вопросе на сервер, показывает на то, что пользователь хочет сделать. Есть 4 маркера:

  • GET — для чтения более подробной информации о том, о чем спрашивается. После получения данных GET возвращается и предоставляет ресурс в виде XML или JSON. Если выявляется ошибка, то выскакивает ошибка 404 (не найдено) или 400 (плохой регистр).
  • POST — используется, если нужно сформировать свежий или вложенный сайт, страницу. При организации нового требование движется к родительскому контенту и берет на себя ответственность организовать связь.
  • PUT — обновить то, что уже существует. Тело должно иметь обновленные данные с оригинального сайта — как полностью, так и только часть. Чтобы создать новые экземпляры, лучше задействовать предыдущий вариант.
  • DELETE — стереть имеющийся объект, который имеет конкретный URI. Если все выполнено успешно, то возвращается код 200 вместе с реакцией, содержащей удаленный пункт. Еще один возможный вариант — 204, если нет тела. Когда выполняется этот запрос, то ресурс удаляется.

Код, который коротко поясняет ответ сервера

Есть 2 типичных результата, которые выводятся на странице:

  • 200 — успешно найдена;
  • 404 — отсутствует на сайте.

Если вашему бизнесу необходимо ПО, которое поможет оптимизировать текущую деятельность, наладить автоматизацию рутинных операций, обращайтесь в «Клеверенс». Мы разрабатываем и реализуем мобильные системы учета, предоставляя широкий спектр решений для магазинов, складов, различных учреждений и производства. В качестве Application Programming Interface в наших продуктах используется REST API.

JSON: что это такое

В каждом руководстве указывается, что так называется формат, в котором хранится информация, которую может прочитать человек. В файле содержится только текст, а расширение проставляется такое же, как заголовок пункта.

Он хранит структурированные данные и передает их от сервера до клиента и обратно. Эти пакеты являются более легкой альтернативой другому расширению с похожим функционалом — XML.

Его задействуют, чтобы добиться асинхронной загрузки данных. Это нужно, чтобы сайты могли обновлять свои медиафайлы без перезагрузки страницы.

Сейчас это очень популярный формат, потому что он занимает меньше места, а продуктивность с ним вырастает в несколько раз.

С его помощью пользователи запрашивают информацию из других доменов с применением тегов типа script. Никакие иные включить не получится, так как существуют правила ограничения домена.

REST API с примерами использования и запросов

Всемирная паутина основана на этой архитектуре. Поэтому, если составлять стиль без них, то софт получится неоптимальным. Как следствие, не всегда можно открыть ресурс и воспользоваться им.

Где может быть задействована:

  • есть ограничение на пропускную способность, нужно повысить возможности загрузки страниц или приложений;
  • появилась необходимость кешировать;
  • предполагается, что систему планируется значительно масштабировать;
  • в сервисах, которые используют в своей работе AJAX.

Главное — не путать написание. Rest IP — это не существующее название.

Слово API применяется в различных значениях. Вот пара примеров его использования:

  • в качестве небольшого фрагмента с определенной функцией;
  • сервер, полностью или завершенная часть.

Например, требуется создать веб-сервер, в котором будет располагаться медиаконтент о каком-то производстве, о его доходе, персонале и т.д.. Всем частям присваивается свой id.

Хотите внедрить «Магазин 15»?

Получите всю необходимую информацию у специалиста.

Спасибо!
Спасибо, ваша заявка принята.
Продолжить

Основные запросы

Как мы уже говорили выше, есть 4 основных вида:

  • Delete. Стирает имеющиеся объекты.
  • Put. Обновляет существующее поле.
  • Get. Читает или получает информацию.
  • Post. Помогает формировать новый ресурс.

Вывод

Мы рассмотрели, как выполняется разработка rest api service и ее методы, как он действует в рамках различных протоколов и как быстро отвечает пользователю. Постарались подробно остановиться на вопросах целесообразности его создания и том, из каких компонентов он состоит. Изучили методы HTTP, что такое JSON и привели примеры применения. Сервис выгодно выделяется на фоне других систем, поэтому его стоит задействовать там, где скорость отклика играет решающую роль.

Количество показов: 6716

Лучшие практики проектирования REST API

December 13, 2016 Jazz Team Технические статьи,

Введение

Здравствуйте, дорогие читатели! Прежде чем вы начнёте читать эту статью, я хотел бы описать цели её создания и рассказать, что побудило меня на её написание.

На одном из проектов нашей компании появилось необходимость спроектировать серверное приложение в стиле REST. Изначально нам казалось, что это довольно простая задача и для её решения нам хватит только собственного опыта.

Но, когда стартовал процесс разработки архитектуры и приведения REST-сервисов к единому стилю, у нас с коллегами начали возникать спорные вопросы и появляться разные точки зрения на реализацию того или иного аспекта. Тут мы поняли, что необходимо открыть гугл и обратиться к помощи коллективного разума, изучить предлагаемые лучшие практики, которые необходимо использовать при проектировании RESTful приложения.

Данная статья будет полезна для тех людей, которые уже имеют некоторый опыт работы с веб-приложениями (и возможно с REST-сервисами), но нуждаются в закреплении и стандартизации полученных знаний.

Определение

Для начала нужно определиться, что же такое REST. Википедия даёт на этот вопрос следующий ответ. REST (Representational State Transfer — «передача состояния представления») — архитектурный стиль взаимодействия компонентов распределённого приложения в сети. REST представляет собой согласованный набор ограничений, учитываемых при проектировании распределённой гипермедиа-системы.

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

Также нужно понимать, что такое REST-сервис. Я бы дал определение REST-сервису, как “точка взаимодействия клиентского приложения с сервером”. Говоря Java терминологией – это сервлет, на который клиент посылает запрос.

Проблематика

Но прежде чем начинать описывать правила, я хотел бы донести мысль о том, что REST – это не стандарт, потому нет единых строгих правил, которых стоит придерживаться. Это значит, что до сих пор нет полной согласованности о том, какие решения лучше применять в той или иной ситуации. Очень часто заходят споры о том, какие HTTP методы использовать и какой HTTP код возвращать в каждой конкретной ситуации.

Более подробно о проблемах REST можно почитать тут.
Соответственно, рекомендации, которые я опишу ниже, стоит принимать во внимание, но не следовать им на 100%, если это может повредить какому-либо другому аспекту проекта.

Однако если вы будете следовать всем рекомендациям, то получится спроектировать очень понятную и поддерживаемую систему, с которой приятно работать.

Название сервиса

Для начала необходимо выбрать имя для REST сервиса. Под именем сервиса я подразумеваю его путь в URI запросе. Например, http://my-site.by/api/rest/service/name. Для выбора имени нам нужно понимать что такое “ресурсы” в архитектуре REST.

Представление ресурса

В терминологии REST что угодно может быть ресурсом — HTML-документ, изображение, информация о конкретном пользователе и т.д. Если ресурс представляет собой некоторый объект, его легко представить, используя некоторый стандартный формат, например, XML или JSON. Далее сервер может отправить данный ресурс, используя выбранный формат, а клиент сможет работать с полученным от сервера ресурсом, используя этот же формат.

Пример представления ресурса “профиль” в формате JSON:

{
    "id":1,
    "name":"Mahesh",
    "login":"manesh"
} 

REST не накладывает явных ограничений на формат, который должен быть использован для представления ресурсов, но есть ряд правил, которым нужно следовать при разработке формата, который будет использоваться для представления ресурса:

  • Клиент и сервер должны “понимать” и иметь возможность работать с выбранным форматом.
  • Ресурс можно полностью описать, используя выбранный формат независимо от сложности ресурса.
  • Формат должен предусматривать возможность представления связей между ресурсами.

Пример представления ресурса “заказ” и его связи с ресурсом “профиль”:

{
    id: 11254,
    currency: "EUR",
    amount: 100,
    profile: {
        id: 11,
        uri: "http://MyService/Profiles/11"
    }
}

Как видно, не обязательно полностью дублировать всю структуру ресурса, на который ссылается другой ресурс. Вместо этого можно использовать понятную ссылку на другой ресурс.

Обращение к ресурсу

Каждый ресурс должен быть уникально обозначен постоянным идентификатором. «Постоянный» означает, что идентификатор не изменится за время обмена данными, и даже когда изменится состояние ресурса. Если ресурсу присваивается другой идентификатор, сервер должен сообщить клиенту, что запрос был неудачным и дать ссылку на новый адрес. Каждый ресурс однозначно определяется URL. Это значит, что URL по сути является первичным ключом для единицы данных. То есть, например, вторая книга с книжной полки будет иметь вид /books/2, а 41 страница в этой книге — /books/2/pages/41. Отсюда и получается строго заданный формат. Причем совершенно не имеет значения, в каком формате находятся данные по адресу /books/2/pages/41 – это может быть и HTML, и отсканированная копия в виде jpeg-файла, и документ Word.

Рекомендуется при определении имени REST-сервиса использовать имена ресурсов во множественном числе. Такой подход позволяет добавлять новые REST-сервисы лишь расширяя имена уже существующих. Например, сервис /books вернёт нам список всех книг, /books/3 вернёт информацию о 3-ей книге, а сервис /books/3/pages вернёт все страницы 3-ей книги.

Для сервисов, которые выполняют какие-то специфические действия над ресурсом, есть 2 подхода для указания действия: в имени сервиса или в его параметрах. Например, /books/3/clean или /books/3?clean. Я предпочитаю первый вариант, так как обычно такие сервисы не редко используют POST методы, которые не поддерживают передачу параметров в URl, что делает сервис, на мой взгляд, не очень читабельным. Используя определение типа действия в имени сервиса, мы делаем наш сервис более расширяемым, так как он не зависит от типа HTTP метода.

Также очень не рекомендуется использовать имена, включающие в себя несколько слов и описывающие бизнес составляющую сервиса (как это рекомендуется делать при именовании java методов). Например, вместо /getAllCars лучше сделать метод /cars. Если же метод нельзя никак описать одним словом, то необходимо применять единый стиль разделителей, я обычно использую ‘-’, что является наиболее популярным подходом. Например, /cars/3/can-sold.

Более подробно о проектировании названий REST-сервисов можно прочитать в этой статье.

HTTP методы

Далее нам необходимо выбрать HTTP метод, который будет использовать наш REST-сервис, ведь имея даже одинаковое имя, но разные методы, REST-сервисы выполняют совершенно различные действия.

В REST используются 4 основных HTTP метода: GET, POST, PUT, DELETE. В большинстве случаев каждый из методов служит для выполнения предопределённого ему действия из CRUD (create, read, update, delete — «создание, чтение, обновление, удаление»).
POST – create, GET – read, PUT – update, DELETE – delete.

ВАЖНОЕ ДОПОЛНЕНИЕ: Существуют так называемые REST-Patterns, которые различаются связыванием HTTP-методов с тем, что они делают. В частности, разные паттерны по-разному рассматривают POST и PUT. Однако, PUT предназначен для создания, замены или обновления, для POST это не определено (The POST operation is very generic and no specific meaning can be attached to it). Поэтому иногда POST и PUT можно поменять местами. Но в большинстве случаев POST используют для создания, а PUT для редактирования, и чуть позже я объясню почему.

Приведу несколько примеров использования различных методов для взаимодействия с ресурсами.

  • GET /books/ – получает список всех книг. Как правило, это упрощенный список, т.е. содержащий только поля идентификатора и названия объекта, без остальных данных.
  • GET /books/{id} – получает полную информацию о книге.
  • POST /books/ – создает новую книгу. Данные передаются в теле запроса.
    PUT /books/{id} – изменяет данные о книге с идентификатором {id}, возможно заменяет их. Данные также передаются в теле запроса.
  • OPTIONS /books – получает список поддерживаемых операций для указанного ресурса (практически не используется)
  • DELETE /books/{id}– удаляет данные с идентификатором {id}.

Безопасность и идемпотентность

Очень помогут в выборе HTTP метода знания о безопасности и идемпотентности этих методов.

Безопасный запрос — это запрос, который не меняет состояние приложения.

Идемпотентный запрос — это запрос, эффект которого от многократного выполнения равен эффекту от однократного выполнения.

Судя по данной таблице, GET-запрос не должен менять состояние ресурса, к которому применяется. PUT и DELETE запросы могут менять состояние ресурса, но их можно спокойно повторять, если нет уверенности, что предыдущий запрос выполнился. В принципе, это логично: если многократно повторять запрос удаления или замены определенного ресурса, то результатом будет удаление или замена ресурса. Но POST запрос, как мы видим из таблицы, небезопасный и неидемпотентный. То есть мало того, что он меняет состояние ресурса, так и многократное его повторение будет производить эффект, зависимый от количества повторений. Ему по смыслу соответствует операция добавления новых элементов в БД: выполнили запрос Х раз, и в БД добавилось Х элементов.

Также приведу пример того, почему GET-запросы не должны изменять состояние ресурса. GET-запросы могут кэшироваться, например, на уровне прокси-сервера. В таком случае запрос может даже не дойти до сервера приложения, а в качестве ответа прокси-сервер вернёт информацию из кэша.

HTTP коды

В стандарте HTTP описано более 70 статус кодов. Хорошим тоном является использование хотя бы основных.

  • 200 – OK – успешный запрос. Если клиентом были запрошены какие-либо данные, то они находятся в заголовке и/или теле сообщения.
  • 201 – OK – в результате успешного выполнения запроса был создан новый ресурс.
  • 204 – OK – ресурс успешно удалён.
  • 304 – Not Modified – клиент может использовать данные из кэша.
  • 400 – Bad Request – запрос невалидный или не может быть обработан.
  • 401 – Unauthorized – запрос требует аутентификации пользователя.
  • 403 – Forbidden – сервер понял запрос, но отказывается его обработать или доступ запрещен.
  • 404 – Not found – ресурс не найден.
  • 500 – Internal Server Error – разработчики API должны стараться избежать таких ошибок.

Эти ошибки должны быть отловлены в глобальном catch-блоке, залогированы, но они не должны быть возвращены в ответе.

Чем обширнее набор кодов, который мы будем использовать, тем более понятный будет API, который мы создаём. Однако нужно учесть, что некоторые коды браузеры обрабатывают по-разному. Например, некоторые браузеры получив код ответа 307 сразу же выполняют редирект, а некоторые позволяют обработать такую ситуацию и отменить действие. Прежде чем использовать тот или иной код, необходимо полностью понимать, как он будет обрабатываться на клиентской стороне!

Более подробно о HTTP кодах можно почитать тут.

Headers

Рекомендуется при проектировании REST-сервисов явно указывать заголовки, в которых обозначен формат обмена данными:

  • Content-Type – формат запроса;
  • Accept – список форматов ответа.

Параметры поиска ресурсов

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

Фильтрация

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

Например, чтобы вывести все красные книги необходимо выполнить запрос:

GET /books?color=red

Сортировка

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

GET /books?sort=-year,+name

Пагинация

Для того, чтобы поддержать возможность загрузки списка ресурсов, которые должны отображаться на определённой странице приложения, в REST API должен быть предусмотрен функционал пагинации. Реализуется он с помощью знакомых нам по SQL параметрам limit и offset. Например:

GET /books?offset=10&limit=5

Помимо того хорошим тоном является вывод ссылок на предыдущую, следующую, первую и последнюю страницы в хидере Link. Например:

Link: <http://localhost/api/books?offset=15&limit=5>; rel=”next”,
<http://localhost/api/books?offset=50&limit=3>; rel=”last”,
<http://localhost/api/books?offset=0&limit=5>; rel=”first”,
<http://localhost/api/books?offset=5&limit=5>; rel=”prev”

Рекомендуется также возвращать общее количество ресурсов в хидере X-Total-Count.

Выбор полей ресурса

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

GET /books?fields=id,color

Хранение состояния

Одно из ограничений RESTful сервисов заключается в том, что они не должны хранить состояние клиента, от которого получают запросы.

Пример сервиса, не хранящего состояние:
Request1: GET http://MyService/Persons/1 HTTP/1.1
Request2: GET http://MyService/Persons/2 HTTP/1.1

Каждый из этих запросов может быть обработан независимо от другого.

Пример сервиса, хранящего состояние:
Request1: GET http://MyService/Persons/1 HTTP/1.1
Request2: GET http://MyService/NextPerson HTTP/1.1

Чтобы обработать второй запрос, серверу потребуется “запомнить” id последнего человека, который был запрошен клиентом. Т.е. сервер должен “запомнить” свое текущее состояние, иначе второй запрос не может быть обработан. При проектировании сервиса, следует избегать необходимости в хранении состояния, так как это имеет ряд преимуществ.

Преимущества сервиса, не хранящего состояние:

  • сервис обрабатывает запросы независимо друг от друга;
  • архитектура сервиса упрощается;
  • не требуется дополнительных усилий для реализации сервисов с использованием протокола HTTP, который также не хранит состояния.

Недостатки сервиса, не хранящего состояние:

  • клиент сам должен отвечать за передачу необходимого контекста сервису.

 

Версионность

Хорошим тоном является поддержка версионности REST API. Это позволит в дальнейшем легко расширять API, без обязательного внесения изменений в клиенты, которые уже пользуются им.
Имеются несколько подходов реализации версионности:

  • С использованием Accept хидера. В данном случае версия API указывается в Accept – Accept:text/v2+json
  • С использованием URI. В таком подходе версия API указывается прямо в URI – http://localhost/api/v2/books
  • Использование кастомного хидера. Можно использовать собственный хидер, который будет отвечать только за передачу версии API – API-Version:v2
  • Использование параметра запроса. Можно использовать параметр запроса для передачи версии API – /books?v=2

Каждый из представленных способов имеет право на существование, у каждого есть свои плюсы и минусы. Однако только Вам решать, какой способ реализации версионности подойдёт Вашему проекту.

Документация

Для удобного пользования нашими REST сервисами нужно создать хорошую и понятную документацию. Для этих целей можно использовать различные инструменты, например, Mashape или Apiary, но я рекомендую использовать Swagger.

Swagger – это технология, которая позволяет документировать REST-сервисы. Swagger поддерживает множество языков программирования и фреймворков. Плюс, Swagger предоставляет UI для просмотра документации.

Получить более подробную информацию о Swagger можно по данной ссылке.

Архивирование

Для экономии трафика рекомендуется использовать архивирование, при передаче больших данных. Это сократит время выполнения запроса. В большинстве современных фреймворков данная функция реализована по умолчанию.

Кэширование

Также для сокращения запросов к БД и увеличения быстродействия наших REST сервисов рекомендуется применить механизм кэширования. Кэширование можно настраивать как на уровне сервера, так и в самом приложении, в зависимости от ситуации.

Кэшированием можно управлять используя следующие HTTP заголовки:

  • Date – дата и время создания ресурса.
  • Last Modified – дата и время последнего изменения ресурса на сервере.
  • Cache-Control – заголовок HTTP 1.1 используемый для управления кэшированием.
  • Age – время, прошедшее с момента последнего получения ресурса, заголовок может быть добавлен промежуточным (между клиентом и сервером) компонентом (например, прокси сервер)

Рекомендации по кэшированию:

  • Рекомендуется кэшировать статические ресурсы, такие как изображения, стили css, файлы javascript.
  • Не рекомендуется указывать большое время жизни кэша.
  • Динамическое содержимое должно кэшироваться на короткое время или не кэшироваться вообще.

 

 Общие рекомендации

Тип представления ресурса

Хотя REST не накладывает явных ограничений на формат, который должен быть использован для представления ресурсов, наиболее популярными являются XML и JSON.

Существует множество библиотек в разных языках программирования для удобной работы с этими форматами. Несмотря на это, рекомендуется использовать именно JSON для представления ресурсов. Это более легкий, читабельный формат, с которым проще работать по сравнению с XML, а так же проще выполнять сериализацию/десериализацию объектов в различных языках программирования.
Однако иногда для поддержки некоторых REST клиентов сервису необходимо поддерживать XML формат. В таком случае можно реализовать поддержку обоих форматов и указывать в параметре запроса, в каком формате должен быть представлен ответ.

Использование проверенных решений для авторизации

Используйте для авторизации проверенные и отработанные схемы.
Не изобретайте свой велосипед с использованием md5 подписей данных и прочего, доверьтесь профессионалам в области защиты данных. Всё уже придумано за Вас: OAuth, OpenID, APIKeys.

Обработка исключений

При возникновении ошибочных ситуаций необходимо выводить отформатированную и понятную информацию. Это относится в первую очередь к статус коду в HTTP ответе. Ошибки в сервисах чаще всего относятся к двум типам:

  • 4xx – ошибки клиента;
  • 5xx – ошибки сервера.

В случае ошибки клиента, например, ошибки валидации какого-то из параметров запроса, в теле ответа рекомендуется передавать полезную информацию об ошибке: сообщение, описание, код (например в формате JSON). В случае ошибки сервера отправлять дополнительную информацию в теле ответа не всегда возможно, например, в случаях когда сервер не доступен.

Плохим тоном является вывод всего стэк трейса исключения. Рекомендуется для каждой исключительной ситуации иметь свой код. В дальнейшем при выводе информации об ошибке можно будет добавить ссылку на документацию, в которой данный код будет выступать уникальным идентификатором.
Например:

{
   "code" : 1234,
   "message" : "Something bad happened :(",
   "description" : "More details about the error here",
   “moreInfo”: “http:/localhost/api/v2/errors/1234”
}

 Полезные ссылки

HTTP метод, REST, RESTful, мануал, техническая статья

Что такое REST API?

Что такое REST? Если вы занимаетесь, веб-программированием, наверняка, вам приходилось сталкиваться с этим понятием. 

Давайте будем разбираться, что это такое и зачем это нужно.

Представим, что мы являемся веб-программистами и разрабатываем какое-то большое веб-приложение. Может быть мы разрабатываем свою социальную сеть, например, как вконтакте, или сервис email рассылок, и.т.д.

На начальном этапе всем может быть хорошо, но как только дело дойдет до того, что нужно будет дать возможность каким-то другим сервисам или приложениям взаимодействовать с нашим, здесь могут начинаться проблемы. 

Например, нужно дать возможность изменять настройки нашего веб-приложения, например, через мобильное приложение или мы хотим выводить какие-то внутренние части нашего приложения на сторонних сайтах. 

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

Как мы можем приложению с другого сайта запросить данные с нашего веб-сервера и, чтобы он мог вывести эту информацию. 

Какое-то другое приложение может запрашивать какую-то другую информацию. 

Также наше приложение может общаться  с внешней базой данных. Сохранять и получать оттуда какие-то данные.   

Для того, чтобы это стало возможным, нашему сервису нужен некий интерфейс, возможность, которая могла бы предоставить всем сторонним приложениям возможность получать данные с нашего приложения обновлять и обмениваться данными.

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

Обмениваться данными всем этим системам может быть довольно сложно. 

Как же сделать, чтобы все эти системы умели понимать друг друга даже если они разговаривают на разных языках. 

Если все эти системы умеют работать по протоколу HTTP по сети Интернет, помочь решить проблему стыковки этих разных систем может так называемый REST.

Что это это такое. 

REST (Representational State Transfer («передача состояния представления»)). 

По сути, REST — это просто набор правил. Там есть 6 основных правил, как программисту организовать написание серверного кода приложения, чтобы все системы легко обменивались данными и все системы можно было бы легко масштабировать и увеличивать. 

REST — это просто набор правил к написанию кода. Код приложения этим правилам может как соответствовать (так называемый RESTful сервис), так и не соответствовать. 

Можно обмениваться данными с разными сервисами и без REST. В этом случае у вас могут возникать сложности в обмене данными между этими устройствами.

REST — это некий стандарт, который приводит все в соответствие и устройства могут без проблем этими данными обмениваться. 

Если вы разработали RESTfull приложение, то по окончании разработки у вас будет некий список url-адресов, с помощью которых можно будет общаться с нашим веб-сервером. Сервер с их помощью может получать запросы на получение, обновление, добавление или удаление данных. 

С помощью списка таких адресов мы предоставляем некий интерфейс, с помощью которого другие сервисы с ним могут взаимодействовать.

Обращаясь к списку таких адресов можно выполнять такие запросы как GET (получить), POST (сохранить), PUT (обновить), DELETE (удалить).

Различные примеры приложений, которые разработаны по принципам REST, вы можете посмотреть в видео выше.

REST-сервис · Loginom Help

Задаются параметры подключения, запроса и ответа REST-сервиса. Выходные данные подключения используются узлом REST-запрос.

URLGETPOSTPUTDELETE
example.com/matchesПолучаем список матчейСоздаем заново список матчейОбновляем список матчейМстим директору букмекерской конторы
example.com/matches/28Получаем детали матча с ID=28Создаем информацию о матчеОбновляем детали матчаУдаляем матч

Информация о документе

Предисловие

Часть I Введение

1. Обзор

2. Использование учебных примеров

Часть II Веб-уровень

3. Начало работы с веб-приложениями

4. Технология JavaServer Faces

5. Знакомство с Facelets

6. Язык выражений

7. Использование технологии JavaServer Faces на веб-страницах

8.Использование конвертеров, слушателей и валидаторов

9. Разработка с использованием технологии JavaServer Faces

10. Технология JavaServer Faces: расширенные концепции

11. Использование Ajax с технологией JavaServer Faces

12. Составные компоненты: дополнительные темы и пример

13. Создание настраиваемых компонентов пользовательского интерфейса и других настраиваемых объектов

14. Настройка приложений JavaServer Faces

15. Технология сервлетов Java

16.Загрузка файлов с помощью технологии сервлетов Java

17. Интернационализация и локализация веб-приложений

Веб-службы, часть III

18. Введение в веб-службы

19. Создание веб-сервисов с помощью JAX-WS

20. Создание веб-служб RESTful с помощью JAX-RS

Создание класса корневых ресурсов RESTful

Разработка веб-служб RESTful с помощью JAX-RS

Обзор приложения JAX-RS

Шаблоны аннотации @Path и пути URI

Ответы на методы и запросы HTTP

Аннотации указателя метода запроса

Использование поставщиков сущностей для сопоставления тел сущностей HTTP-ответа и запроса

Использование @Consumes и @Produces для настройки запросов и ответов

Аннотация @Produces

Аннотация @Consumes

Параметры запроса на извлечение

Примеры приложений для JAX-RS

Веб-служба RESTful

Создание веб-службы RESTful с помощью IDE NetBeans

Пример приложения rsvp

Компоненты примера приложения rsvp

Запуск примера приложения rsvp

Примеры из реальной жизни

Дополнительная информация о JAX-RS

21.JAX-RS: дополнительные темы и пример

Корпоративные бобы, часть IV

22. Корпоративные бобы

23. Начало работы с корпоративными компонентами

24. Запуск примеров корпоративных компонентов

25. Пример объекта, управляемого сообщениями

26. Использование встроенного контейнера корпоративных компонентов

27. Использование асинхронного вызова метода в сессионных компонентах

Часть V Внедрение контекстов и зависимостей для платформы Java EE

28.Введение в внедрение контекстов и зависимостей для платформы Java EE

29. Запуск основных контекстов и примеров внедрения зависимостей

30. Внедрение контекстов и зависимостей для платформы Java EE: дополнительные темы

31. Выполнение расширенных примеров внедрения контекстов и зависимостей

Часть VI Стойкость

32. Введение в Java Persistence API

33. Запуск примеров сохранения состояния

34. Язык запросов сохраняемости Java

35.Использование API критериев для создания запросов

36. Создание и использование запросов на основе строковых критериев

37. Управление одновременным доступом к данным объекта с блокировкой

38. Использование кэша второго уровня с приложениями Java Persistence API

Часть VII Безопасность

39. Введение в безопасность на платформе Java EE

40. Начало работы Защита веб-приложений

41. Начало работы Защита корпоративных приложений

42.Безопасность Java EE: дополнительные темы

Часть VIII Технологии поддержки Java EE

43. Введение в технологии поддержки Java EE

44. Сделки

45. Ресурсы и адаптеры ресурсов

46. Пример адаптера ресурсов

47. Концепции службы сообщений Java

48. Примеры службы сообщений Java

49. Проверка компонентов: расширенные темы

50. Использование перехватчиков Java EE

Часть IX Примеры из практики

51.Пример

книжного магазина Duke’s Bookstore

52. Пример из практики «Репетиторство Герцога»

53. Пример из практики Duke’s Forest

Индекс

Что такое веб-службы RESTful?

Веб-службы RESTful созданы для лучшей работы в Интернете. Изобразительное State Transfer
(REST) ​​- это архитектурный стиль, определяющий ограничения, такие как унифицированный интерфейс,
что при применении к веб-службе вызывает желаемые свойства, такие как производительность,
масштабируемость и модифицируемость, которые позволяют службам лучше всего работать в Интернете.В
архитектурный стиль REST, данные и функциональность считаются ресурсами и доступны с использованием
Универсальные идентификаторы ресурсов (URI) , обычно ссылки в Интернете. Ресурсы обрабатываются с помощью
набор простых, четко определенных операций. Архитектурный стиль REST ограничивает архитектуру
архитектура клиент / сервер и предназначена для использования протокола связи без сохранения состояния, обычно
HTTP. В стиле архитектуры REST клиенты и серверы обмениваются представлениями ресурсов.
за счет использования стандартизованного интерфейса и протокола.

Следующие принципы способствуют тому, чтобы приложения RESTful были простыми, легкими и быстрыми:

  • Идентификация ресурса через URI : веб-служба RESTful предоставляет набор ресурсов, которые идентифицируют цели взаимодействия со своими клиентами. Ресурсы идентифицируются с помощью URI, которые обеспечивают глобальное адресное пространство для обнаружения ресурсов и служб. Для получения дополнительной информации см. Аннотацию @Path и шаблоны пути URI.

  • Единый интерфейс : Управление ресурсами осуществляется с помощью фиксированного набора из четырех операций создания, чтения, обновления и удаления: PUT, GET, POST и DELETE.PUT создает новый ресурс, который затем можно удалить с помощью DELETE. GET извлекает текущее состояние ресурса в некотором представлении. POST передает новое состояние ресурсу. См. Раздел «Ответ на методы и запросы HTTP» для получения дополнительной информации.

  • Сообщения с самоописанием : Ресурсы отделены от их представления, поэтому к их содержимому можно получить доступ в различных форматах, таких как HTML, XML, обычный текст, PDF, JPEG, JSON и другие. Метаданные о ресурсе доступны и используются, например, для управления кэшированием, обнаружения ошибок передачи, согласования соответствующего формата представления и выполнения аутентификации или управления доступом.Дополнительные сведения см. В разделах «Ответ на методы и запросы HTTP» и «Использование поставщиков сущностей для сопоставления тел сущностей HTTP-ответа и запроса».

  • Взаимодействия с сохранением состояния через гиперссылки : каждое взаимодействие с ресурсом не имеет состояния; то есть сообщения запроса являются самодостаточными. Взаимодействия с сохранением состояния основаны на концепции явной передачи состояния. Существует несколько методов обмена состоянием, таких как перезапись URI, файлы cookie и скрытые поля формы. Состояние может быть встроено в ответные сообщения, чтобы указывать на допустимые будущие состояния взаимодействия.Дополнительные сведения см. В разделах «Использование поставщиков сущностей для сопоставления тел сущностей HTTP-ответов и запросов» и «Создание URI» в документе «Обзор JAX-RS».

Авторские права © 2013, Oracle и / или ее дочерние компании. Все права защищены. Юридические уведомления