Интерфейс = общая граница двух отдельно существующих составных частей, посредством которой они обмениваются информацией в режиме одновременности. Этот обмен может быть, как двусторонним, так и односторонним.
Протокол = набор соглашений интерфейса логического уровня. Эти соглашения задают единообразный способ передачи сообщений и обработки ошибок при взаимодействии программного обеспечения разнесённой в пространстве аппаратуры, соединённой тем или иным интерфейсом.
TCP/IP = набор сетевых протоколов передачи данных.
Стек протоколов TCP/IP включает в себя четыре уровня:
URL состоит из протокола (protocol), хоста (host), пути (path), запроса (query) и фрагмента. Путь используется для организации иерархических ресурсов, запрос — для неиерархических ресурсов и для параметров операции. Фрагмент идентифицирует подчинённый ресурс, не имеющий прямого URL, обычно это якорная ссылка на странице.
Protocol Host Path Query Fragment ↓ ↓ ↓ ↓ ↓ http://nyashnye-kotiki.xxx/breeds/maine-coon/?deliver_to=Moscow#photo
HTTP (HyperText Transfer Protocol — "протокол передачи гипертекста") — прикладной протокол передачи данных. Основой HTTP является технология "клиент-сервер", то есть предполагается существование потребителей (клиентов), которые инициируют соединение и посылают запрос, и поставщиков (серверов), которые ожидают соединения для получения запроса, производят необходимые действия и возвращают обратно сообщение с результатом.
Эта диаграмма отображает простейшую архитектуру веб-приложения:
Каждое HTTP-сообщение состоит из трёх частей, которые передаются в указанном порядке:
Общая структура запроса:
Обычный GET-запрос.
Запрос клиента:
GET /wiki/страница HTTP/1.1
Host: ru.wikipedia.org
User-Agent: Mozilla/5.0 (X11; U; Linux i686; ru; rv:1.9b5) Gecko/2008050509 Firefox/3.0b5
Accept: text/html
Connection: close
(пустая строка)
Ответ сервера:
HTTP/1.1 200 OK
Date: Wed, 11 Feb 2009 11:20:59 GMT
Server: Apache
X-Powered-By: PHP/5.2.4-2ubuntu5wm1
Last-Modified: Wed, 11 Feb 2009 11:20:59 GMT
Content-Language: ru
Content-Type: text/html; charset=utf-8
Content-Length: 1234
Connection: close
(пустая строка)
(HTML-код запрошенной страницы)
HTTP-протокол (начиная с версии 1.1) оперирует методами OPTIONS , GET , HEAD , POST , PUT , PATCH , DELETE , TRACE , CONNECT (ссылки на RFC).
GET используется для запроса данных с указанного адреса ресурса.
Клиент МОЖЕТ передавать параметры запроса прямо в первой строке запроса в URI целевого ресурса после символа "?":
GET /path/resource?param1=value1¶m2=value2 HTTP/1.1
HEAD синонимичен по семантике методу GET, но не обязан возвращать тело ответа, а только лишь его заголовки (метаинформацию о ресурсе).
POST применяется для передачи ДАННЫХ В ТЕЛЕ ЗАПРОСА по заданному адресу.
Например, оставить комментарий на форуме. Аналогично с помощью метода POST обычно загружаются файлы на сервер. Сервер уже сам решает что с вашими данными делать.
POST forum.com/threads/gameofthrones/messages
Обратите внимание, если вы по ошибке или вследствие сетевых проблем повторите POST запрос — создастся второе сообщение в треде, идентичное первому.
PUT применяется для отправки некоторых данных на конкретный указанный в запросе URI. Если по заданному URI не существует ресурс, то сервер создаёт его и возвращает статус 201 (Created). Если же был изменён ресурс, то сервер возвращает 200 (Ok) или 204 (No Content).
PUT forum.com/threads/gameofthrones/messages/100500
PUT вы можете делать хоть 500 раз, в нашем примере — форумный пост всё равно будет один. Это свойство называется идемпотентностью.
PUT может использоваться как для создания новых ресурсов, так и для обновления старых. Однако в случае использования PUT для перезаписи предполагается, что в теле запроса передаётся закодированный ресурс целиком.
Фундаментальное различие методов POST и PUT заключается в понимании предназначений URI ресурсов. Метод POST предполагает, что по указанному URI будет производиться обработка передаваемого клиентом содержимого. Используя PUT, клиент предполагает, что загружаемое содержимое соответствует находящемуся по данному URI ресурсу.
HTTP | CRUD | Ответы для всей коллекции (/customers) |
Ответы для конкретного ID (/customers/{id}) |
Примеры запросов |
---|---|---|---|---|
POST | Create | 201 (Created), 'Location' header со ссылкой на /customers/{id} содержащей новый ID | 404 (Not Found), 409 (Conflict) если ресурс уже существует |
POST http://site.com/customers
POST http://site.com/customers/123/orders
|
GET | Read | 200 (OK), список Клиентов | 200 (OK). 404 (Not Found) если ID не найден или неправилен |
GET http://site.com/customers/123
GET http://site.com/customers/123/orders
|
PUT | Update /Replace |
405 (Method Not Allowed), разве только вы не захотите обновить/заменить каждый ресурс во всей коллекции | 200 (OK) или 204 (No Content). 404 (Not Found) если ID не найден или неправилен |
PUT http://site.com/customers/123
PUT http://site.com/customers/123/orders/98765
|
PATCH | Update /Modify |
405 (Method Not Allowed), раазве только вы не заходите изменить саму коллекцию | 200 (OK) или 204 (No Content). 404 (Not Found) если ID не найден или неправилен |
PATCH http://site.com/customers/123
PATCH http://site.com/customers/123/orders/98765
|
DELETE | Delete | 405 (Method Not Allowed), разве только вы не захотите удалить всю коллекцию. | 200 (OK). 404 (Not Found) если ID не найден или неправилен |
DELETE http://site.com/customers/123
DELETE http://site.com/customers/123/orders
|
HEAD | ||||
OPTIONS | ||||
TRACE | ||||
CONNECT |
REST (Representational State Transfer — "передача репрезентативного состояния") = архитектурный стиль построения распределённых приложений, имеющий 6 ограничений, дающих (по заявлению автора) большую производительность и масштабируемость системы.
Ограничения, соблюдение которых дают веб-сервису "право" называться RESTful: