HTTP - обзор основных концепций протокола

Внимание

Данный материал является частью цикла статей «Протокол HTTP». Не забудьте посмотреть другие статьи по этой теме :-)

  1. HTTP - обзор основных концепций протокола
  2. Архитектурные аспекты HTTP
  3. HTTP - идентификация клиента
  4. HTTP - механизмы аутентификации
  5. HTTP - безопасность, TLS и сертификаты
  6. HTTP справочник

Что такое протокол HTTP?

Автором HTTP является Тим Бернерс-Ли (парень также считается изобретателем всемирной паутины). Среди других имен, важных для развития HTTP, также есть Рой Филдинг, кто также является основоположником архитектурного стиля REST.

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

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

Из этого изображения вы можете ясно видеть, что HTTP - это протокол приложения, а TCP работает на транспортном уровне.

Ресурсы

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

А как отличить один ресурс от другого?

Предоставляя им URL-адреса (унифицированные указатели ресурсов).

URL-адрес указывает на уникальное место, где находится ресурс.

Как обмениваться сообщениями между веб-клиентом и веб-сервером

Каждая часть контента, каждый ресурс живет на каком-то веб-сервере (HTTP-сервере). Эти серверы ожидают запросов на эти ресурсы.

Но как запросить ресурс с веб-сервера?

Вам, конечно же, нужен клиент

Вы используете HTTP-клиент прямо сейчас, чтобы прочитать эту статью. Веб-браузеры - это HTTP-клиенты. Они связываются с HTTP-серверами для загрузки ресурсов на ваш компьютер. Одними из самых популярных клиентов являются Google Chrome, Mozilla Firefox, Opera, Apple Safari и, к сожалению, до сих пор печально известный Internet Explorer.

Некоторые примеры сообщений

Так как же выглядит сообщение HTTP?

Не вдаваясь в подробности, вот несколько примеров HTTP-сообщений:

Запрос GET

GET /repos/CodeMazeBlog/ConsumeRestfulApisExamples HTTP/1.1
Host: api.github.com
Content-Type: application/json
Authorization: Basic dGhhbmtzIEhhcmFsZCBSb21iYXV0LCBtdWNoIGFwcHJlY2lhdGVk
Cache-Control: no-cache

POST запрос

POST /repos/CodeMazeBlog/ConsumeRestfulApisExamples/hooks?access_token=5643f4128a9cf974517346b2158d04c8aa7ad45f HTTP/1.1
Host: api.github.com
Content-Type: application/json
Cache-Control: no-cache

{
  "url": "http://www.example.com/example",
  "events": [
    "push"
  ],
  "name": "web",
  "active": true,
  "config": {
    "url": "http://www.example.com/example",
    "content_type": "json"
  }
}

Вот пример одного запроса GET и одного запроса POST. Давайте рассмотрим различные части этих запросов.

Первая строка запроса зарезервирована для строки запроса. Она состоит из метода запроса имени , URI запроса и версии HTTP.

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

Для запроса GET история на этом заканчивается. Запрос POST также может иметь тело и нести дополнительную информацию в форме основного сообщения. В данном случае это сообщение JSON с дополнительной информацией о том, как создать веб-хук GitHub для данного репо, указанного в URI. Это сообщение требуется для создания веб-хук, поэтому мы используем запрос POST для предоставления этой информации API GitHub.

Строка запроса и заголовки запроса должны сопровождаться <CR><LF> (возврат каретки и перевод строки \r\n), и между заголовками сообщения и телом сообщения есть одна пустая строка, содержащая только CRLF.

Ссылка для HTTP-запроса: https://www.w3.org/Protocols/rfc2616/rfc2616-sec5.html

А что мы получаем в ответ на эти запросы?

Ответное сообщение

HTTP/1.1 200 OK
Server: GitHub.com
Date: Sun, 18 Jun 2017 13:10:41 GMT
Content-Type: application/json; charset=utf-8
Transfer-Encoding: chunked
Status: 200 OK
X-RateLimit-Limit: 5000
X-RateLimit-Remaining: 4996
X-RateLimit-Reset: 1497792723
Cache-Control: private, max-age=60, s-maxage=60

[
  {
    "type": "Repository",
    "id": 14437404,
    "name": "web",
    "active": true,
    "events": [
      "push"
    ],
    "config": {
      "content_type": "json",
      "insecure_ssl": "0",
      "url": "http://www.example.com/example"
    },
    "updated_at": "2017-06-18T12:17:15Z",
    "created_at": "2017-06-18T12:03:15Z",
    "url": "https://api.github.com/repos/CodeMazeBlog/ConsumeRestfulApisExamples/hooks/14437404",
    "test_url": "https://api.github.com/repos/CodeMazeBlog/ConsumeRestfulApisExamples/hooks/14437404/test",
    "ping_url": "https://api.github.com/repos/CodeMazeBlog/ConsumeRestfulApisExamples/hooks/14437404/pings",
    "last_response": {
      "code": 422,
      "status": "misconfigured",
      "message": "Invalid HTTP Response: 404"
    }
  },
]

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

Заголовки ответаи текст ответаидут сразу после строки состояния.

Ссылка для ответа HTTP: https://www.w3.org/Protocols/rfc2616/rfc2616-sec6.html

Типы MIME

Типы MIME представляют собой стандартизированный способ описания типов файлов в Интернете. В вашем браузере есть список типов MIME, то же самое и для веб-серверов. Таким образом, мы сможем передавать файлы, независимо от операционной системы.

Интересным фактом является то, что MIME расшифровывается как Multipurpose Internet Mail Extension, поскольку изначально они были разработаны для мультимедийной электронной почты. С тех пор они были адаптированы для использования для HTTP и некоторых других протоколов.

Каждый тип MIME состоит из типа, подтипаи списка необязательных параметровв следующем формате: тип/подтип;необязательные параметры.

Вот несколько примеров:

Content-Type: application/json
Content-Type: text/xml; charset=utf-8
Accept: image/gif

Вы можете найти список часто используемых типов и подтипов MIME в Ссылка HTTP.

Методы запроса

Методы HTTP-запроса (также называемые «глаголами») определяют действие, которое будет выполнено над ресурсом. HTTP определяет несколько методов запроса. Наиболее широко известны / используются методы GET и POST

Метод запроса может быть идемпотентным или неидемпотентным. Это просто причудливый термин для объяснения того, что метод безопасен/небезопасен для вызова несколько раз на одних и тех же ресурсах. Другими словами, это означает, что GET метод, единственная цель которого - получение информации, по умолчанию должен быть идемпотентным. Вызов GET на одном и том же ресурсе снова и снова не должен приводить к другому ответу. С другой стороны, метод POST не является идемпотентным методом.

До HTTP / 1.1 было всего три метода: GET, POST и HEAD, а спецификация HTTP / 1.1 добавляла в обращение еще несколько методов: OPTIONS, PUT, DELETE, TRACE и CONNECT

Заголовки

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

Есть пять типов заголовков:

  • Общие заголовки. Эти заголовки полезны как для сервера, так и для клиента. Хорошим примером является поле заголовка "Date", в котором содержится информация о времени создания сообщения.
  • Заголовки запроса: относятся к сообщениям с запросом. Они предоставляют серверу дополнительную информацию. Например, поле заголовка Accept: */* информирует сервер о том, что клиент желает получить любой тип мультимедиа.
  • Заголовки ответа: относятся к ответным сообщениям. Они предоставляют клиенту дополнительную информацию. Например, поле заголовка Allow: GET, HEAD, PUT сообщает клиенту, какие методы разрешены для запрошенного ресурса.
  • Заголовки объекта. Эти заголовки связаны с телом объекта. Например, заголовок Content-Type: text/html сообщает приложению, что данные являются HTML-документом.
  • Заголовки расширений. Это нестандартные заголовки, которые разработчики приложений могут создавать. Хотя они не являются частью HTTP, он их поддерживает.

Коды статуса

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

Вот некоторые примеры:

  • 200 OK - успешное выполнение запроса
  • 404 Not Found - запрашиваемый ресурс не найден
  • 500 Internal Server Error - внутренняя ошибка сервера

Коды статуса классифицируются по диапазону в пяти различных группах.

Классификацию кодов статуса и весь список кодов статуса и их значение можно найти в справочнике по HTTP.

Заключение

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

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