HTML Diff
0 added 0 removed
Original 2026-01-01
Modified 2026-02-21
1 <p>Когда вы заходите на сайт, браузер отправляет запрос на сервер, получает от него ответ и выводит нужную страницу. Но у всех сайтов - разные серверы, информация на которых хранится по-разному.</p>
1 <p>Когда вы заходите на сайт, браузер отправляет запрос на сервер, получает от него ответ и выводит нужную страницу. Но у всех сайтов - разные серверы, информация на которых хранится по-разному.</p>
2 <p>Чтобы браузер понимал, что именно ему нужно запросить, а сервер - что ответить, используют API, или программные интерфейсы приложений. Если вы не знаете или не помните, что это такое и что такое архитектурные стили вообще, рекомендуем сначала прочитать<a>эту статью</a>.</p>
2 <p>Чтобы браузер понимал, что именно ему нужно запросить, а сервер - что ответить, используют API, или программные интерфейсы приложений. Если вы не знаете или не помните, что это такое и что такое архитектурные стили вообще, рекомендуем сначала прочитать<a>эту статью</a>.</p>
3 <p>API могут быть разными. Самый востребованный из них - REST. О нём и пойдёт речь в этой статье.</p>
3 <p>API могут быть разными. Самый востребованный из них - REST. О нём и пойдёт речь в этой статье.</p>
4 <p><strong>REST API</strong>- это архитектурный подход, который устанавливает ограничения для API: как они должны быть устроены и какие функции поддерживать. Это позволяет стандартизировать работу программных интерфейсов, сделать их более удобными и производительными.</p>
4 <p><strong>REST API</strong>- это архитектурный подход, который устанавливает ограничения для API: как они должны быть устроены и какие функции поддерживать. Это позволяет стандартизировать работу программных интерфейсов, сделать их более удобными и производительными.</p>
5 <p>Слово REST - акроним от Representational State Transfer, что переводится на русский как "передача состояния представления", "передача репрезентативного состояния" или "передача "самоописываемого“ состояния".</p>
5 <p>Слово REST - акроним от Representational State Transfer, что переводится на русский как "передача состояния представления", "передача репрезентативного состояния" или "передача "самоописываемого“ состояния".</p>
6 <p>В отличие от, например, SOAP API, REST API - не протокол, а простой список рекомендаций, которым можно следовать или не следовать. Поэтому у него нет собственных методов. С другой стороны, его автор Рой Филдинг создал ещё и <a>протокол HTTP</a>, так что они очень хорошо сочетаются, и REST обычно используют в связке с HTTP. Хотя новичкам нужно помнить:<strong>REST - это не только HTTP, а HTTP - не только REST</strong>.</p>
6 <p>В отличие от, например, SOAP API, REST API - не протокол, а простой список рекомендаций, которым можно следовать или не следовать. Поэтому у него нет собственных методов. С другой стороны, его автор Рой Филдинг создал ещё и <a>протокол HTTP</a>, так что они очень хорошо сочетаются, и REST обычно используют в связке с HTTP. Хотя новичкам нужно помнить:<strong>REST - это не только HTTP, а HTTP - не только REST</strong>.</p>
7 <p>Иногда, помимо акронима REST, можно встретить слово<strong>RESTful</strong>. Это не термин, но в сообществе его применяют к веб-сервисам, которые соответствуют REST-архитектуре. RESTful используют как прилагательное.</p>
7 <p>Иногда, помимо акронима REST, можно встретить слово<strong>RESTful</strong>. Это не термин, но в сообществе его применяют к веб-сервисам, которые соответствуют REST-архитектуре. RESTful используют как прилагательное.</p>
8 <p>Всего в REST есть шесть требований к проектированию API. Пять из них обязательные, одно - опциональное:</p>
8 <p>Всего в REST есть шесть требований к проектированию API. Пять из них обязательные, одно - опциональное:</p>
9 <ul><li>Клиент-серверная модель (client-server model).</li>
9 <ul><li>Клиент-серверная модель (client-server model).</li>
10 <li>Отсутствие состояния (statelessness).</li>
10 <li>Отсутствие состояния (statelessness).</li>
11 <li>Кэширование (cacheability).</li>
11 <li>Кэширование (cacheability).</li>
12 <li>Единообразие интерфейса (uniform interface).</li>
12 <li>Единообразие интерфейса (uniform interface).</li>
13 <li>Многоуровневая система (layered system).</li>
13 <li>Многоуровневая система (layered system).</li>
14 <li>Код по требованию (code on demand) - необязательно.</li>
14 <li>Код по требованию (code on demand) - необязательно.</li>
15 </ul><p>Чтобы разобраться в них подробнее, нужно понимать, что в вебе называют ресурсами.<strong>Ресурсы</strong> - это любые данные: текст, изображение, видео, аудио, целая программа. Например,<a>HTML веб-страницы</a>, на которой вы сейчас находитесь, - тоже ресурс.</p>
15 </ul><p>Чтобы разобраться в них подробнее, нужно понимать, что в вебе называют ресурсами.<strong>Ресурсы</strong> - это любые данные: текст, изображение, видео, аудио, целая программа. Например,<a>HTML веб-страницы</a>, на которой вы сейчас находитесь, - тоже ресурс.</p>
16 <p>Это требование отделяет друг от друга два понятия: клиент и сервер.</p>
16 <p>Это требование отделяет друг от друга два понятия: клиент и сервер.</p>
17 <p><strong>Сервер</strong>- программа, в которой хранятся и обрабатываются ресурсы. Сервер может располагаться на одном или нескольких компьютерах; но даже в одном компьютере может быть несколько виртуальных серверов. Допустим, изначально HTML-код этой статьи хранился где-то на серверах Skillbox.</p>
17 <p><strong>Сервер</strong>- программа, в которой хранятся и обрабатываются ресурсы. Сервер может располагаться на одном или нескольких компьютерах; но даже в одном компьютере может быть несколько виртуальных серверов. Допустим, изначально HTML-код этой статьи хранился где-то на серверах Skillbox.</p>
18 <p><strong>Клиент</strong>- программа, которая запрашивает у сервера доступ к ресурсам. Для этого она использует API. Когда ваш браузер запрашивает у сервера Skillbox эту веб-страницу, он выступает в роли клиента.</p>
18 <p><strong>Клиент</strong>- программа, которая запрашивает у сервера доступ к ресурсам. Для этого она использует API. Когда ваш браузер запрашивает у сервера Skillbox эту веб-страницу, он выступает в роли клиента.</p>
19 <p>Получается структура, при которой клиент направляет к серверу запрос, а в ответ получает ресурсы. Такое разделение позволяет создавать клиент и сервер независимо друг от друга, что ускоряет и упрощает разработку.</p>
19 <p>Получается структура, при которой клиент направляет к серверу запрос, а в ответ получает ресурсы. Такое разделение позволяет создавать клиент и сервер независимо друг от друга, что ускоряет и упрощает разработку.</p>
20 <em>Изображение: Майя Мальгина для Skillbox Media</em><p>Представим, что вы делаете сервис для учёта деловых переписок. Сами переписки хранятся на сервере, а доступ к ним можно получить из мобильного приложения. Оно не будет хранить никаких данных - только отправлять запросы на сервер, получать ответы и отображать их на экране смартфона.</p>
20 <em>Изображение: Майя Мальгина для Skillbox Media</em><p>Представим, что вы делаете сервис для учёта деловых переписок. Сами переписки хранятся на сервере, а доступ к ним можно получить из мобильного приложения. Оно не будет хранить никаких данных - только отправлять запросы на сервер, получать ответы и отображать их на экране смартфона.</p>
21 <p>Если вы когда-нибудь захотите полностью изменить логику работы сервера, то это никак не отразится на мобильном приложении. До тех пор, пока они понимают запросы и ответы друг друга, конечно.</p>
21 <p>Если вы когда-нибудь захотите полностью изменить логику работы сервера, то это никак не отразится на мобильном приложении. До тех пор, пока они понимают запросы и ответы друг друга, конечно.</p>
22 <p>А чтобы дать доступ к сервису из десктопного приложения и личного сайта, достаточно написать два новых клиента - а на сервере ничего менять не надо. Такая вот гибкость.</p>
22 <p>А чтобы дать доступ к сервису из десктопного приложения и личного сайта, достаточно написать два новых клиента - а на сервере ничего менять не надо. Такая вот гибкость.</p>
23 <em>Изображение: Майя Мальгина для Skillbox Media</em><p>Второй принцип настолько важен, что даже отражён в названии архитектурного стиля -<strong>Representational State Transfer</strong>. Это значит, что на сервере не хранится никаких данных о прошлых взаимодействиях с клиентом - каждый запрос должен содержать всю информацию для его обработки.</p>
23 <em>Изображение: Майя Мальгина для Skillbox Media</em><p>Второй принцип настолько важен, что даже отражён в названии архитектурного стиля -<strong>Representational State Transfer</strong>. Это значит, что на сервере не хранится никаких данных о прошлых взаимодействиях с клиентом - каждый запрос должен содержать всю информацию для его обработки.</p>
24 <p>Например, кто-то запросил последнее сообщение от ООО "Рога и копыта". В этом запросе содержится вся информация, которая нужна серверу, чтобы дать корректный ответ.</p>
24 <p>Например, кто-то запросил последнее сообщение от ООО "Рога и копыта". В этом запросе содержится вся информация, которая нужна серверу, чтобы дать корректный ответ.</p>
25 <p>Если клиент потом хочет получить предпоследнее сообщение, то он не может просто сказать: "Дай мне соседний ресурс" - ему нужно заново составить полный запрос по всем правилам.</p>
25 <p>Если клиент потом хочет получить предпоследнее сообщение, то он не может просто сказать: "Дай мне соседний ресурс" - ему нужно заново составить полный запрос по всем правилам.</p>
26 <p>Это снижает нагрузку на сервер, что особенно полезно, если к нему подключено одновременно много клиентов. Не нужно хранить дополнительную информацию о прошлых обращениях каждого из них. Достаточно обработать каждый запрос в отдельности.</p>
26 <p>Это снижает нагрузку на сервер, что особенно полезно, если к нему подключено одновременно много клиентов. Не нужно хранить дополнительную информацию о прошлых обращениях каждого из них. Достаточно обработать каждый запрос в отдельности.</p>
27 <p>Даже если какой-то из предыдущих запросов потеряется, это не сломает логику взаимодействия клиента и сервера, потому что каждый запрос самодостаточен.</p>
27 <p>Даже если какой-то из предыдущих запросов потеряется, это не сломает логику взаимодействия клиента и сервера, потому что каждый запрос самодостаточен.</p>
28 <p>Иногда клиент запрашивает с сервера одни и те же данные по несколько раз - например, вы постоянно обращаетесь к какому-нибудь важному письму в сервисе для учёта деловых переписок.</p>
28 <p>Иногда клиент запрашивает с сервера одни и те же данные по несколько раз - например, вы постоянно обращаетесь к какому-нибудь важному письму в сервисе для учёта деловых переписок.</p>
29 <p>Если при каждом таком запросе сервер будет с нуля собирать нужные данные и отправлять их клиенту, нагрузка на систему повысится - особенно когда таких повторов много. Решением проблемы в REST API стало<strong>кэширование</strong>, то есть сохранение части данных у клиента или на промежуточных серверах.</p>
29 <p>Если при каждом таком запросе сервер будет с нуля собирать нужные данные и отправлять их клиенту, нагрузка на систему повысится - особенно когда таких повторов много. Решением проблемы в REST API стало<strong>кэширование</strong>, то есть сохранение части данных у клиента или на промежуточных серверах.</p>
30 <p>Однако тут тоже важно подойти к делу без излишнего фанатизма и не кэшировать всю информацию подряд. Во-первых, для этого потребовались бы слишком большие объёмы памяти. Во-вторых, какие-то данные (скажем, количество исходящих писем) со временем могут устаревать - зачем же держать этот неактуальный хлам в кэше? Именно поэтому в каждом ответе сервера на запрос есть пометка о том, можно ли его кэшировать.</p>
30 <p>Однако тут тоже важно подойти к делу без излишнего фанатизма и не кэшировать всю информацию подряд. Во-первых, для этого потребовались бы слишком большие объёмы памяти. Во-вторых, какие-то данные (скажем, количество исходящих писем) со временем могут устаревать - зачем же держать этот неактуальный хлам в кэше? Именно поэтому в каждом ответе сервера на запрос есть пометка о том, можно ли его кэшировать.</p>
31 <p>Должен быть<strong>единый способ обращения</strong>к каждому ресурсу. Например, мы хотим добавить в наш сервис новую функциональность для просмотра данных о денежных переводах. Понятно, что логика интерфейса для обращения к ним должна быть такой же, как и для всего, что было в сервисе раньше.</p>
31 <p>Должен быть<strong>единый способ обращения</strong>к каждому ресурсу. Например, мы хотим добавить в наш сервис новую функциональность для просмотра данных о денежных переводах. Понятно, что логика интерфейса для обращения к ним должна быть такой же, как и для всего, что было в сервисе раньше.</p>
32 <p>Файлы обычно передаются клиенту не в том виде, в котором хранятся на сервере. В вебе их часто преобразуют в JSON или XML и только потом отправляют клиенту. Ответ на запросы к новому ресурсу должен приходить в том же формате, что и к старым, и сразу же содержать дополнительную информацию: что разрешается делать с ресурсом, можно ли его изменять и удалять на сервере и так далее.</p>
32 <p>Файлы обычно передаются клиенту не в том виде, в котором хранятся на сервере. В вебе их часто преобразуют в JSON или XML и только потом отправляют клиенту. Ответ на запросы к новому ресурсу должен приходить в том же формате, что и к старым, и сразу же содержать дополнительную информацию: что разрешается делать с ресурсом, можно ли его изменять и удалять на сервере и так далее.</p>
33 <p>Для реализации единообразного интерфейса в REST API используется принцип<strong>HATEOAS</strong>(Hypermedia as the Engine of Application State).</p>
33 <p>Для реализации единообразного интерфейса в REST API используется принцип<strong>HATEOAS</strong>(Hypermedia as the Engine of Application State).</p>
34 <p>До сих пор мы рассматривали сервер как единую сущность. Но его структура куда сложнее. Между ним и клиентом есть несколько промежуточных узлов, выполняющих вспомогательные функции, -<strong>прокси-серверы</strong>.</p>
34 <p>До сих пор мы рассматривали сервер как единую сущность. Но его структура куда сложнее. Между ним и клиентом есть несколько промежуточных узлов, выполняющих вспомогательные функции, -<strong>прокси-серверы</strong>.</p>
35 <p>Они используются для кэширования, обеспечения безопасности, дополнительной обработки данных. Если основных серверов несколько, то дополнительные серверы-балансировщики могут распределять нагрузку между ними и решать, в какой из них направлять запрос:</p>
35 <p>Они используются для кэширования, обеспечения безопасности, дополнительной обработки данных. Если основных серверов несколько, то дополнительные серверы-балансировщики могут распределять нагрузку между ними и решать, в какой из них направлять запрос:</p>
36 <em>Изображение: Майя Мальгина для Skillbox Media</em><p>Никто из участников цепочки не знает всего пути, который проходит запрос, - только своих "соседей" справа и слева. Ни клиент, ни один из прокси-серверов не знает, к кому он обращается - к основному сервису или к другому прокси. В REST API это работает в обе стороны: никакие серверы (ни основные, ни прокси) не знают, кому отправляют ответ и уходит ли он куда-то дальше.</p>
36 <em>Изображение: Майя Мальгина для Skillbox Media</em><p>Никто из участников цепочки не знает всего пути, который проходит запрос, - только своих "соседей" справа и слева. Ни клиент, ни один из прокси-серверов не знает, к кому он обращается - к основному сервису или к другому прокси. В REST API это работает в обе стороны: никакие серверы (ни основные, ни прокси) не знают, кому отправляют ответ и уходит ли он куда-то дальше.</p>
37 <p>Этот принцип означает, что сервер в ответ на запрос может<strong>отправить исходный код</strong>, который выполняется уже на стороне клиента. Благодаря этому можно передавать целые сценарии. Например, динамические элементы пользовательского интерфейса, написанные на JavaScript.</p>
37 <p>Этот принцип означает, что сервер в ответ на запрос может<strong>отправить исходный код</strong>, который выполняется уже на стороне клиента. Благодаря этому можно передавать целые сценарии. Например, динамические элементы пользовательского интерфейса, написанные на JavaScript.</p>
38 <p>В REST API требование необязательно, потому что не всем сайтам и сервисам нужно умение работать с готовыми скриптами.</p>
38 <p>В REST API требование необязательно, потому что не всем сайтам и сервисам нужно умение работать с готовыми скриптами.</p>
39 <p>Так как REST - архитектурный подход, а не протокол, в нём не заложено никаких конкретных методов. Но чаще всего его применяют вместе со стандартом<strong>HTTP</strong>, в котором заложены собственные методы.</p>
39 <p>Так как REST - архитектурный подход, а не протокол, в нём не заложено никаких конкретных методов. Но чаще всего его применяют вместе со стандартом<strong>HTTP</strong>, в котором заложены собственные методы.</p>
40 <p>Если кратко, то в HTTP прописан набор действий, который можно описать аббревиатурой<strong>CRUD</strong>: create - "создать", read - "прочитать", update - "обновить", delete - "удалить".</p>
40 <p>Если кратко, то в HTTP прописан набор действий, который можно описать аббревиатурой<strong>CRUD</strong>: create - "создать", read - "прочитать", update - "обновить", delete - "удалить".</p>
41 <p>Для каждого такого действия существуют один или несколько глаголов - это и есть методы. Например, GET для чтения, а PUT и PATCH - для разных видов обновления. Глагол-метод применяется к URL-адресу нужного ресурса, который в "предложении" выполняет роль существительного.</p>
41 <p>Для каждого такого действия существуют один или несколько глаголов - это и есть методы. Например, GET для чтения, а PUT и PATCH - для разных видов обновления. Глагол-метод применяется к URL-адресу нужного ресурса, который в "предложении" выполняет роль существительного.</p>
42 <p>Подробнее о работе протокола HTTP и его методов вы можете прочесть в <a>нашей статье</a>.</p>
42 <p>Подробнее о работе протокола HTTP и его методов вы можете прочесть в <a>нашей статье</a>.</p>
43 <p>Архитектурный стиль REST - самый распространённый подход к проектированию API. Вот в каких случаях его применяют:</p>
43 <p>Архитектурный стиль REST - самый распространённый подход к проектированию API. Вот в каких случаях его применяют:</p>
44 <ul><li>пропускная способность соединения с сервером ограничена;</li>
44 <ul><li>пропускная способность соединения с сервером ограничена;</li>
45 <li>нужно соединить мобильные приложения с серверными;</li>
45 <li>нужно соединить мобильные приложения с серверными;</li>
46 <li>проект разбит на микросервисы;</li>
46 <li>проект разбит на микросервисы;</li>
47 <li>сервис предоставляет свои возможности другим разработчикам;</li>
47 <li>сервис предоставляет свои возможности другим разработчикам;</li>
48 <li>используется AJAX;</li>
48 <li>используется AJAX;</li>
49 <li>известно, что систему нужно будет масштабировать.</li>
49 <li>известно, что систему нужно будет масштабировать.</li>
50 </ul><p>Как мы видим, REST API не случайно стал таким популярным. Повторим основные его отличия:</p>
50 </ul><p>Как мы видим, REST API не случайно стал таким популярным. Повторим основные его отличия:</p>
51 <ul><li><strong>REST - это архитектурный стиль API.</strong>Он не ограничивается никакими протоколами и не имеет собственных методов. Но обычно в RESTful-сервисах используют стандарт HTTP, а файлы передают в формате JSON или XML.</li>
51 <ul><li><strong>REST - это архитектурный стиль API.</strong>Он не ограничивается никакими протоколами и не имеет собственных методов. Но обычно в RESTful-сервисах используют стандарт HTTP, а файлы передают в формате JSON или XML.</li>
52 <li>Есть<strong>шесть принципов</strong>, на которых строится REST: клиент-серверная модель, отсутствие состояния, кэширование, единообразие интерфейса, многоуровневая система, код по требованию. Последний из них необязателен.</li>
52 <li>Есть<strong>шесть принципов</strong>, на которых строится REST: клиент-серверная модель, отсутствие состояния, кэширование, единообразие интерфейса, многоуровневая система, код по требованию. Последний из них необязателен.</li>
53 <li><strong>REST-подход к архитектуре</strong>позволяет сделать сервисы отказоустойчивыми, гибкими и производительными, а при их масштабировании и внесении изменений не возникает больших сложностей.</li>
53 <li><strong>REST-подход к архитектуре</strong>позволяет сделать сервисы отказоустойчивыми, гибкими и производительными, а при их масштабировании и внесении изменений не возникает больших сложностей.</li>
54 </ul>
54 </ul>