Основы REST: теория и практика
REST, Representational State Transfer, является архитектурным стилем для обеспечения стандартов между компьютерными системами в сети, что облегчает для систем обмен данными друг с другом. Системы, отвечающие требованиям REST и часто называемые RESTful, характеризуются тем, что не имеют сохранения состояния и разделяют интересы клиента и сервера. Мы рассмотрим, что означают эти термины и почему они являются полезными для услуг в Интернете.
Разделение клиента и сервера
В архитектурном стиле REST реализация клиента и реализация сервера могут быть выполнены независимо друг от друга. Это означает, что код на стороне клиента может быть изменён в любое время без ущерба для работы сервера, а код на стороне сервера может быть изменён без влияния на работу клиента.
Как общаются программы / Что такое API, REST, CRUD и CLI / #домавместе
До тех пор, пока каждая сторона знает, какой формат сообщений следует направлять другой стороне, они могут храниться модульно и раздельно. Отделяя задачи пользовательского интерфейса от задач хранения данных, мы повышаем гибкость интерфейса между платформами и улучшаем расширяемость за счёт упрощения компонентов сервера. Кроме того, разделение позволяет каждому компоненту развиваться независимо.
Используя интерфейс REST, различные клиенты попадают в одни и те же конечные точки REST, выполняют те же действия и получают одинаковые ответы.
Отсутствие сохранения состояния
Системы, которые следуют парадигме REST, не имеют сохранения состояния, что означает, что серверу не нужно знать о состоянии клиента и наоборот. Таким образом, и сервер, и клиент могут понять любое полученное сообщение, даже не увидев предыдущих сообщений. Это отсутствие сохранения состояния обеспечивается за счёт использования ресурсов, а не команд. Они описывают любые объекты, документы или вещи, которые могут потребоваться для хранения или отправки в другие службы.
Эти ограничения помогают RESTful-приложениям достигать надёжности, быстрой производительности и расширяемости, как компонентам, которые могут быть управляемы, обновлены и повторно использованы, не затрагивая систему в целом даже во время её работы.
Теперь мы изучим, как на самом деле происходит взаимодействие между клиентом и сервером, когда мы внедряем RESTful-интерфейс.
Взаимодействие между клиентом и сервером
В архитектуре REST клиенты отправляют запросы на поиск или изменение ресурсов, а серверы отправляют ответы на эти запросы. Давайте рассмотрим стандартные способы направления запросов и ответов.
Отправка запросов
REST требует, чтобы клиент сделал запрос на сервер для получения или изменения данных на сервере. Запрос обычно состоит из:
- НТТР-метода, который определяет вид операции;
- заголовка, который позволяет клиенту передавать информацию о запросе;
- пути к ресурсу;
- необязательного тела сообщения, содержащего данные.
Существует 4 основных метода НТТР, которые мы используем в запросах для взаимодействия с ресурсами в системе REST:
Что такое REST API
- GET — получение конкретного ресурса (по id) или коллекцию ресурсов;
- POST — создание нового ресурса;
- PUT — обновление конкретного ресурса (по id);
- DELETE — удаление конкретного ресурса по id;
В заголовке запроса клиент отправляет тип контента, который он может получить с сервера. Это поле называется Accept. Оно обеспечивает, что сервер не посылает данные, которые не могут быть поняты или обработаны клиентом. Параметры типов контента — это типы MIME (или Multipurpose Internet Mail Extensions, о которых вы можете прочитать больше в MDN Web Docs).
Типы MIME, используемые для указания типов контента в поле Accept, состоят из типа и подтипа. Они разделены слэшем (/).
Другие типы и часто используемые подтипы:
- image — image/png , image/jpeg , image/gif ;
- audio — audio/wav , audio/mpeg ;
- video — video/mp4 , video/ogg ;
- application — application/json , application/pdf , application/xml , application/octet-stream .
Например, клиент, имеющий доступ к ресурсу с идентификатором 123 в ресурсе статей на сервере, может отправить запрос GET следующим образом:
GET/news/123 Accept: text/html, application/xhtml
Запросы должны содержать путь к ресурсу, на котором должна выполняться операция. В RESTful API пути должны быть разработаны так, чтобы помочь клиенту понять, что происходит. Обычно первая часть пути должна быть множественной формой ресурса. Это позволяет легко читать и понимать вложенные пути.
Пути должны содержать информацию, необходимую для определения местоположения ресурса с необходимой степенью конкретности. При ссылке на список или коллекцию ресурсов не всегда необходимо добавлять идентификатор. Например, запрос POST на путь somesite.com/persons не будет нуждаться в дополнительном идентификаторе, так как сервер генерирует идентификатор для нового объекта.
В тех случаях, когда сервер отправляет клиенту полезную нагрузку, он должен включать тип контента в заголовок ответа. Это поле заголовка контента предупреждает клиента о типе данных, которые он посылает в теле ответа. Эти типы контента являются типами MIME, точно так же, как они находятся в поле Accept заголовка запроса. Тип контента, который сервер возвращает обратно в ответе, должен быть одним из параметров, указанных клиентом в поле принятия запроса.
Например, клиент получает доступ к ресурсу с идентификатором 123 в разделе статей с этим запросом GET:
GET /news/123 HTTP/1.1 Accept: text/html, application/xhtml
Сервер должен отправить обратно контент с заголовком ответа:
HTTP/1.1 200 (OK) Content-Type: text/html
Это означает, что запрашиваемый контент возвращается в тело ответа с text/html — типом контента, который клиент будет в состоянии принять.
Коды ответов
Ответы от сервера содержат коды состояния для оповещения клиента об успехе операции. Как разработчику вам не нужно знать каждый код состояния (их много), но вы должны знать самые распространённые и то, как они используются.
Для каждого метода НТТР ожидаются коды статуса, которые сервер должен вернуть в случае успеха:
- GET — return 200 (OK)
- POST — return 201 (CREATED)
- PUT — return 200 (OK)
- DELETE — return 204 (NO CONTENT)
Если операция не работает, вернётся наиболее конкретный код состояния, соответствующий возникшей проблеме.
Предположим, у нас есть приложение, которое позволяет вам просматривать, создавать, редактировать и удалять клиентов и заказы для небольшого магазина одежды, размещённого на сайте fashionboutique.com. Мы можем создать НТТР API, который позволит клиенту выполнять следующие функции.
Если бы мы хотели увидеть всех клиентов, запрос выглядел бы так:
GET http://somesite.com/persons Accept: application/json
Возможный заголовок ответа будет выглядеть следующим образом:
Status Code: 200 (OK) Content-type: application/json
Затем следуют данные клиентов, запрошенные в формате application/json .
Создание нового клиента путем размещения данных:
Затем сервер генерирует идентификатор этого объекта и возвращает его клиенту с таким заголовком:
201 (CREATED) Content-type: application/json
Для просмотра одного клиента мы используем метод GET, указывая идентификатор этого клиента:
GET http://somesite.com/persons/123 Accept: application/json
Возможный заголовок ответа будет выглядеть следующим образом:
Status Code: 200 (OK) Content-type: application/json
Затем следуют данные ресурса клиента с идентификатором 123 в формате application/json .
Мы можем обновить этого клиента, вставив новые данные с помощью метода PUT:
Возможный заголовок ответа будет иметь Status Code: 200 (OK) , чтобы сообщить клиенту, что элемент с идентификатором 123 был изменен.
Мы также можем УДАЛИТЬ этого клиента, указав его идентификатор:
Ответ будет иметь заголовок, содержащий Status Code: 204 (NO CONTENT) , уведомляющий клиента о том, что объект с идентификатором 123 был удалён и ничего в теле не осталось.
Практика с REST
Давайте представим, что мы создаём сайт для сбора фотографий. Мы хотим сделать API, чтобы отслеживать пользователей, места проведения и фотографии этих мест. Этот сайт имеет index.html и style.css. Каждый пользователь имеет имя пользователя и пароль. Каждая фотография имеет место проведения и владельца (т.е. пользователя, который сделал фотографию).
Каждое место имеет название и адрес. Можете ли вы разработать систему REST, которая будет учитывать:
- хранение пользователей, фотографий и мест проведения;
- доступ к определённым местам и доступ к некоторым фотографиям определённого места проведения?
Для начала опишите:
Возможные решения — модели
< “user”: < «id»: , “username”: , “password”: > > < “photo”: < «id»: , “address_id”: , “user_id”: > > < “address”: < «id»: , “name”: , “value”: > >
Возможное решение — запросы / ответы
GET-запросы
GET /index.html Accept: text/html
200 (OK) Content-type: text/html
GET /style.css Accept: text/css
200 (OK) Content-type: text/css
GET /addresses Accept: application/json
200 (OK) Content-type: application/json
GET /addresses/:id Accept: application/json
200 (OK) Content-type: application/json
GET /addresses/:id /photos/:id Accept: application/json
200 (OK) Content-type: image/png
POST-запросы
POST /users
201 (CREATED) Content-type: application/json
POST /addresses
201 (CREATED) Content-type: application/json
POST /addresses/:id /photos
201 (CREATED) Content-type: application/json
PUT-запросы
PUT /users/:id
Источник: tproger.ru
Rest API от чайника для чайников
На написание статьи побудило чтение книги «Технологии интеграции «1С:Предприятия 8.3″» Хрусталевой Е.Ю. В первой главе там постоянно чередуются слова REST, REST-интерфейс, архитектура REST и т.д. Мне стало интересно, я начал копать, что это такое, и тема оказалась достаточно интересной.
Начнём с некоторых определений
Перед тем, как дать определение REST API, нужно ввести несколько общих определений. Архитектурный стиль – это набор согласованных ограничений и принципов проектирования, позволяющий добиться определённых свойств системы API (Application programming interface) — программный интерфейс приложения для взаимодействия с другими приложениями. Вот теперь можно давать определение REST API.
REST API (Representational State Transfer, передача состояния представления) — архитектурный стиль разработки API веб-приложений или компонентов распределённого приложения, используя протокол HTTP. Другими словами, REST API — это набор правил, позволяющий программисту добиться неких целевых свойств API своего приложения. Что же это за свойства?
Краткая историческая справка
Человеком, который ввёл данную аббревиатуру в оборот, является Рой Филдинг. Произошло это в в 2000 году. Далее выдержка из Википедии:
В своей диссертации «Архитектурные стили и дизайн сетевых программных архитектур» («Architectural Styles and the Design of Network-based Software Architectures») в Калифорнийском университете в Ирвайне[3] он подвёл теоретическую основу под способ взаимодействия клиентов и серверов во Всемирной паутине, абстрагировав его и назвав «передачей представительного состояния» («Representational State Transfer»)
Целевые свойства REST API
- Производительность
- Масштабируемость, выраженная в:
- простота **унифицированного** интерфейса
- лёгкость внесения изменений, т.е. способность эволюционировать, приспосабливаясь к новым требованиям
- надёжность / отказоустойчивость
- переносимость компонентов
Получается, что REST API потребовался, так как возникла потребность создавать производительные, надежные и легко поддающиеся изменению обмены между клиентом и сервером. За счёт чего же это достигается?
Принципы построения REST API
Существует 6 **принципов**, которым должен соответствовать REST-интерфейс:
- единый интерфейс — ресурсы должны быть однозначно идентифицированы посредством одного URL-адреса
- н-р: неверно чтобы для одно и того же объекта для разных HTTP-запросов были разные интерфейсы
GET . getusers PUT . createusers
- верно — когда интерфейс один, а что делать определяется видом запроса
GET . users PUT . users
- Всегда использовать клиент-серверное взаимодействие и разграничивать данные между ними
- пользовательский интерфейс и вопросы сбора запросов — на стороне клиента.
- доступ к данным, управление рабочей нагрузкой и безопасность — на стороне сервера.
- Использовать Stateless protocol (протокол без сохранения состояния) — в период, между запросами никакая информация о *состоянии* клиента на сервере не хранится
- Следствие: в запросе сервер должен получать всю необходимую информацию для выполнения этого запроса
- Использовать кэширование — все ресурсы должны разрешать кэширование, если явно не указано, что оно невозможно, следовательно, все ответы сервера должны иметь явные или неявные обозначения кэшируемых и не кэшируемых ответов
- Учитывать слои взаимодействия — система может быть многоуровневой, и как следствие клиент не может однозначно знать взаимодействует он напрямую с сервером или с промежуточным узлом
- Код по требованию (необязательное условие) — REST может позволить расширить функциональность клиента за счёт загрузки кода с сервера (апплеты или скрипты)
REST и RESTful — в чём разница?
Термин RESTful был введён, чтобы различать сервисы, построенные чётко по шести указанным выше требованиям, от тех, которые соблюдают только часть требований.
RESTful — это приложение, в котором соблюдаются все требования к построению архитектуры REST API. По поводу этого см. чуть ниже в раздел «Недостатки и критика REST API»
Стандарты REST API
Надо понимать, что REST — это не протокол, поэтому у него нет чёткого и единственного стандарта разработки. Единственное, что чётко прописано — транспортом REST-запросов является HTTP. Всё остальное (формат данных, интерфейса API и т.д.) — на усмотрение разработчика.
Недостатки и критика REST API
- завязка на HTTP, спецификация которого имеет свои ограничение
- иногда это приводит к тому, что приходит эмитировать поведение некоторых специфических методов
- чрезмерная выборка — н-р: есть сервис, которые возвращает контактные данные пользователя. Нам надо получить только имя, но сервис настроен на возврат имени, телефона и т.д.
- недостаточная выборка — например сервис, упомянутый выше, возвращает только телефон по умолчанию, а нам нужны все доступные телефоны
- Достаточно ли использовать код HTTP-ответа 200 при создании записи или надо использовать 201?
- Достаточно ли использовать код HTTP-ответа 200 при обновлении записи или надо использовать 250?
REST API в 1С
Долго на этом останавливаться не буду, просто обзорно распишу. В 1С можно выделить следующие способы работы с REST:
- создавать свой REST API (метаданные «Общие — HTTP-сервис»)
- обратиться к любому REST API (методы встроенного языка: HTTPСоединение, HTTPзапрос, HTTPОтвет)
- взаимодействовать с автоматически генерируемый REST-интерфейсом платформы (см. Автоматический REST-интерфейс через протокол OData)
Выводы
В данной статье я постарался дать определение и описание того, что такое REST API. Недаром говорят, что если хочешь до конца понять термин или технологию — постарайся рассказать о ней другому человеку, что в данной статье и проделано ^_^.
Напоследок отмечу, что главный плюс REST — это простота, именно поэтому он долгое время являлся самым популярным стандартом для организации взаимодействия клиента и сервера. Является ли он таким на данный момент, ответить сложно, ибо есть множество интересных альтернатив: старенький, но надёжный, SOAP, передовой GraphQL, RPC, JSON-pure API и многое другое.
Источник: infostart.ru
Что такое REST API?
От автора: что такое REST API? REST – это аббревиатура Representational State Transfer или по-русски «передача репрезентативного состояния» — вообще непонятное описание самой используемой технологии в веб-сервисах! REST API – это способ для двух компьютеров взаимодействовать через HTTP в браузерах и серверах.
Для разработки ПО передача данных между двумя системами или более всегда была фундаментальным требованием. Приведем пример с покупкой автостраховки. Ваш страхователь должен получить информацию о вас, о вашем авто. Для этого он запрашивает данные у Госавтоинспекции, кредитных бюро, банков и других систем. Все эти запросы проходят прозрачно в реальном времени и позволяют страхователю определить, может ли он сделать конкурентное предложение.
API (программный интерфейс приложения) помогает связать разные системы с помощью интерфейса, через который эти системы могут общаться. REST же является лишь широко применяемым сводом правил для API, чтобы коммуникация с внутренними и внешними сервисами была консистентной и предсказуемой. Можно провести аналогию с отправкой письма: для этого нам необходима марка, адрес и конверт. При соблюдении требований мы точно знаем, что письмо будет доставлено и прочитано.
REST повсеместно используется в веб-системах для взаимодействия. Например, получение и обновление данных профиля в социальной сети.
Пример REST API
Перейдите по следующий ссылке, в ответ вы получите случайный вопрос по компьютерам с портала Open Trivia Database.
JavaScript. Быстрый старт
Изучите основы JavaScript на практическом примере по созданию веб-приложения
Это публичный API, реализованный как RESTful веб-сервис (следует правилам REST). В браузере отобразится один вопрос с ответом в формате JSON, как на примере ниже:
Источник: webformyself.com
Так ли нужен REST для веб-приложений?
Многие из вас слышали о таком популярном понятии, как RESTful. Но думаю что не все знают что это такое и в чем преимущества этого подхода. Давайте попробуем разобраться на примере.
Что такое REST?
Термин REST был введен в 2000 году Роем Филдингом. Системы которые базируются на REST принято называть RESTful. Сам по себе REST это не какой-то стандарт, или применяемая технология, это архитектурный стиль. Он лишь дает вам методологию, а реализацию оставляет на ваше усмотрение.
REST предлагает брать в качестве уникального идентификатора для единицы ресурса (к примеру товар или пользователь) url адрес, а определять действие с этой единицей — по типу запроса. Обычное среднестатистическое веб-приложение обходится двумя типами запросов: GET и POST, для получения и соответственно отправки данных.
Но RESTful архитектура подразумевает использовать весь спектр запросов: GET — получить данные, POST — отправить новые данные, PUT — отправить отредактированные данные, DELETE — удалить данные. Есть ещё PATCH, который по своей идеи повторяет PUT, различия лишь в том, что PUT предполагает заменить полностью запись, а PATCH только частично обновить данные. Что интересно, мнения об использовании POST и PUT расходятся. Англоязычные разработчики предпочитают использовать именно PUT для добавления новых данных, а POST для редактирования.
Использование REST на примере GML
Для начала нам нужно определиться с ресурсами, с которыми может взаимодействовать пользователь. На GML у меня получилось: линки (ссылки на веб-ресурсы), сборники (контейнеры для линков), пользователи и теги. Это четыре основных единицы, с которыми происходит работа. Обозначим корневой домен как gml.link/ У нас получаются следующие запросы на получение данных:
- GET gml.link/links/ — получить весь список линков
- GET gml.link/links/125 — получить сто двадцать пятый линк
- GET gml.link/collections/ — получить список всех сборников
- GET gml.link/collection/34 — получить список линков тридцать четвертого сборника
- GET gml.link/tags/ — получить список всех тегов
- GET gml.link/tags/animal — получить список линков с тегом ‘animal’ (для тегов в качестве идентификатора выступает его название, а не номер.)
- PUT gml.link/collections/ (title: ‘Измененное название сборника’) — вернет ошибку, так как не указан идентификатор сборника
- PUT gml.link/collections/12 (title: ‘Измененное название сборника’) — изменит название у двенадцатого сборника
- PUT gml.link/links/117 (title: ‘Другое название линка’) — изменит название у сто семнадцатого линка
- DELETE gml.link/collection/32 — удалит тридцать второй сборник
- DELETE gml.link/links/43 — удалит сорок третий линк
Как мы видим запросы для пользователя получаются совершенно прозрачными, без тайных знаков и выражений. К примеру в предыдущей версии сервиса GML получение списка линков выглядело следующим образом: POST http://gml.link/action.php с кучей параметров в теле запроса типа action=get_links, start=0, finish=30 и так далее, причем в адресной строке был адрес http://gml.link/index.php?target=categoryленивая загрузка» (lazy load), когда данные подгружаются по мере надобности (в моем случае при скролле страницы). Поэтому на запрос линков нужно передавать ещё и страницу (если быть точнее с какого линка и сколько выбрать), поэтому запрос на получение данных с дополнительными параметрами выглядит так: GET gml.link/links/?page=3. Так же дополнительные данные нам понадобятся для поиска: GET gml.link/links/?search=javascript
Совсем немного о технической реализации
(внимание, прочитав данный параграф, ваша жизнь может навсегда измениться)
Так как мы не на хабрахабре, поэтому техническую реализацию я затрону условно.
Для многих, кто только начал знакомиться с архитектурой RESTful, возникает вопрос, кто обработает запрос вида GET gml.link/collections/45, ведь по старой школе запрос идет по пути public_html/collections/45/index.html (public_html — корень сайта). Но у нас нет такой структуры папок, и вообще только один index файл.
На первый взгляд может показаться что это очередные проделки лукавого, но нет, во всем виноваты хитрые люди, которые придумали RewriteEngine (механизм преобразований, управляется сервером Apache, конфигурируется в файле .htaccess), чтоб дурить нашего брата. На самом же деле наш запрос идет по адресу gml.link/index.php?target=collectionlazy load» подгрузка линков, добавление/создание сборника.
Вы можете предложить тему для следующей статьи в рамках сервиса GML. Если же предложений не будет, то следующая статья будет о сборниках, их типах, для чего они нужны и как реализовано добавление/создание сборника.
Источник: spark.ru