Меню

RESTful сервисы. Что это?

01.07.2018 - Back-end, NodeJS

RESTful Services (RESTful APIs)

Большинство приложений использует client-sever архитектуру. Приложение само по себе — это клиентская или front-end часть. Под катом оно связывается с бэкэндом (сервером), чтобы получить или сохранить информацию. Эта коммуникация совершается с помощью HTTP протокола, тот же протокол который питает WEB в целом. На сервере у нас находится группа сервисов, которые доступны по http протоколу. Клиент может напрямую вызывать эти сервисы, посылая http запросы.

REST — Representational State Transfer. Понятно что для вас это не имеет никакого смысла сейчас. REST это соглашение по построению HTTP сервисов.
Итак мы используем простые принципы HTTP протокола, чтобы обеспечить поддержку для создания, чтения, обновления и удаления информации (create, read, update, delete) — CRUD операции. Давайте посмотрим это соглашение на реальном примере. Представим что у нас есть компанию «Pigly» которая арендует свиней. У нас есть клиентское приложение, где мы управляем списком клиентов. На сервере у нас есть сервис, который доступен по адресу http://pigly.io/api/customers. Клиент может сделать запрос к этой точке, чтобы поговорить с сервисом. Несколько вещей про эти конечные точки вы должны знать.

В первую очередь, адрес должен начинаться с http или https. После чего указывается домен приложения. Далее идёт /api. Это необязательно, но вы заметите что огромное количество компаний следует этому соглашению. Они включают слова API где либо в адресе. Это может быть где то после домена, или быть как субдомен. Далее, в нашем случае идет /customers, который указывает на коллекцию клиентов в нашем приложении. В мире REST вы ссылаетесь на эту часть как ресурс. Мы можем отображать наши ресурсы, такие как виды свиней, количество, списки свиней, как разные конечные точки (endPoints). /customer это конечная точка для работы с клиентами. Все операции, связанные с клиентами, такие как создание клиента или обновление инфы о клиенте будут сделаны с помощью отправление http запроса в этот end point. Тип http запроса определяет тип операции. Каждый http запрос имеет, как мы можем назвать — глагол или метод, который определяет его тип.

Вот стандартные HTTP методы.

Давайте рассмотри каждый из них на примере наших клиентов. Чтобы получить список всех клиентов, нам нужно выслать GET HTTP запрос (request) на адрес /api/customers. Когда мы отправляем GET запрос на этот endpoint, то сервер должен нам вернуть что то вроде этого:

http-req

[
    {id: 1, name: ""},
    {id: 2, name: ""},
    {id: 3, name: ""},
    //...
]

Итак, у нас есть массив объектов клиентов. Если нам нужен один клиент, нам нужно включить id этого клиента в адресе. Тогда сервер даст в ответе объект с нужным клиентом.

http-req

Чтобы обновить информацию о клиенте, нам нужно отослать HTTP запрос PUT на наш endpoint. И в нашем примере, 1ца значит id клиента, которого мы хотим обновить. Но еще мы должны вложить объект клиента, в тело запроса. Это окончательное представление объекта клиента с обновленными свойствами. Мы посылаем это на сервер и сервер обновляет клиента с заданным id в соответствие с этим значением.

http-req

Аналогично, чтобы удалить запись клиента с заданным id, мы должны послать HTTP DELETE запрос. Но теперь нам не нужно посылать объект в теле запроса, так как все что нам нужно это удалить клиента с заданным id.

http-req

И наконец, чтобы создать клиента, нам нужно послать HTTP POST запрос на endpoint /api/customers. Так как мы добавляем клиента, то нам не нужно указывать его id в адресе. Мы работает с коллекцией клиентов. Мы постим нового клиента в эту коллекцию. И вот почему мы должны вложить объект клиента в тело запроса. Серевер получит этот объект и создаст клиента для нас.

http-req

Итак, это и есть соглашение по RESTful.

Мы выставляем ресурсы, такие как customers по легкому, значимому адресу и поддерживаем различные операции вокруг них, такие как создание или обновление их, используя стандартные http методы.

Метки: , , , ,

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *