Функции http


Содержание

Golang: Выполнение HTTP запросов

В этом посте мы рассмотрим, как можно делать HTTP-запросы, используя Go. Мы будем использовать пакет net/http, который предоставляет все необходимое для создания HTTP-запросов или создания новых http-серверов. То есть, этот пакет поможет нам сделать все что связано с «http».

Чтобы проверить, что мы сделали правильные запросы, мы будем использовать httpbin, который является хорошим сервисом для тестирования наших запросов на локальных компьютерах.

Простой HTTP-запрос

Давайте сделаем очень простой GET запрос и посмотрим, как мы можем прочитать ответ. Мы отправим простой HTTP-запрос GET на https://httpbin.org/get и прочитаем ответ. Для этого мы можем просто импортировать пакет net/http и использовать вызов функции http.Get:

Мы создали отдельную функцию MakeRequest и вызвали ее из нашей основной функции. Внутри этой функции мы передали URL-адрес http.Get и получили два значения — объект ответа и переменную с ошибками, которые могли произойти во время вызова. Мы проверили, есть ли какие-либо ошибки. Если ошибок не было, ошибка будет равна nil. Обратите внимание, что эта ошибка будет сообщаться только в том случае, если возникла проблема с подключением к серверу и получением ответа. Однако, если сервер отправляет http ответ 500 (что является внутренней ошибкой сервера), вы получите этот код состояния и сообщение об ошибке на соответствующем объекте, а не в переменной err.

Затем мы читаем resp.Body, который реализует интерфейс io.ReadCloser, и мы можем использовать ioutil.ReadAll, чтобы полностью прочитать ответ. Эта функция также возвращает два значения — байтовый срез ([]byte) и err. Опять же, мы проверяем любые возможные ошибки при чтении тела ответа. Если ошибок не было, мы печатаем тело. Обратите внимание на string(body). Здесь мы преобразуем байтовый срез в строку. Если мы этого не сделаем, log.Println будет распечатывать представление байтового фрагмента, списка всех байтов в этом фрагменте, индивидуально. Но нам нужно строковое представление. Поэтому мы идем вперед и делаем преобразование.

Мы увидим, что напечатанный вывод представляет собой JSON объект в виде строки. Итак, в следующем примере мы увидим, как мы можем отправлять и читать сообщения в формате JSON.

Отправка и получение запросов в JSON

Теперь давайте отправим сообщение в формате JSON. Как мы это сделаем? Если вы пришли из Python/Node/Ruby, вы возможно уже использовали для формирования JSON объектов (словари), далее предавали их в свою любимую библиотеку и устанавливали нужный формат передачи данных. Ваша библиотека выполняла для вас преобразование объекта в JSON и отправляла запрос с требуемыми заголовками. В Go, однако, все более явно и меньше магии, что на самом деле хорошо. Вы будете знать, что делаете и как вы это делаете.

В Go мы сначала преобразуем нашу структуру данных в байтовый срез, содержащий JSON-представление данных. Затем мы передаем его запросу с соответствующим типом контента. Давайте посмотрим на пример кода:

Функции HTTP HTTP Features

Устойчивые функции имеет несколько функций, которые упрощают внедрение устойчивых оркестрации и сущностей в рабочие процессы HTTP. Durable Functions has several features that make it easy to incorporate durable orchestrations and entities into HTTP workflows. В этой статье подробно рассматриваются некоторые из этих функций. This article goes into detail about some of those features.

Предоставление API-интерфейсов HTTP Exposing HTTP APIs

Оркестрации и сущности могут вызываться и управляться с помощью HTTP-запросов. Orchestrations and entities can be invoked and managed using HTTP requests. Расширение Устойчивые функции предоставляет встроенные API HTTP. The Durable Functions extension exposes built-in HTTP APIs. Он также предоставляет интерфейсы API для взаимодействия с оркестрации и сущностями из функций, активируемых HTTP. It also provides APIs for interacting with orchestrations and entities from within HTTP-triggered functions.

Встроенные API HTTP Built-in HTTP APIs

Расширение Устойчивые функции автоматически добавляет набор API-интерфейсов HTTP к узлу функций Azure. The Durable Functions extension automatically adds a set of HTTP APIs to the Azure Functions host. С помощью этих API-интерфейсов можно взаимодействовать и управлять согласованиями и сущностями без написания кода. With these APIs, you can interact with and manage orchestrations and entities without writing any code.

Поддерживаются следующие встроенные API HTTP. The following built-in HTTP APIs are supported.

Полное описание всех встроенных API HTTP, предоставляемых расширением Устойчивые функции, см. в статье API-интерфейсы HTTP . See the HTTP APIs article for a full description of all the built-in HTTP APIs exposed by the Durable Functions extension.

Обнаружение URL-адреса API HTTP HTTP API URL discovery

Привязка клиента оркестрации предоставляет интерфейсы API, которые могут создавать удобные полезные данные ответа HTTP. The orchestration client binding exposes APIs that can generate convenient HTTP response payloads. Например, он может создать ответ, содержащий ссылки на API управления для конкретного экземпляра оркестрации. For example, it can create a response containing links to management APIs for a specific orchestration instance. В следующих примерах показана функция HTTP-триггера, которая демонстрирует использование этого API для нового экземпляра оркестрации: The following examples show an HTTP-trigger function that demonstrates how to use this API for a new orchestration instance:

Предкомпилированный код C# Precompiled C#

Сценарии C# C# script

JavaScript с функциями 2,0 или более поздней версии JavaScript with Functions 2.0 or later only

Function.json Function.json

Запуск функции Orchestrator с помощью функций HTTP-триггеров, показанных выше, можно выполнить с помощью любого клиента HTTP. Starting an orchestrator function by using the HTTP-trigger functions shown previously can be done using any HTTP client. Следующая фигурная команда запускает функцию Orchestrator с именем DoWork : The following cURL command starts an orchestrator function named DoWork :

Далее приведен пример ответа для оркестрации с идентификатором abc123 в качестве идентификатора. Next is an example response for an orchestration that has abc123 as its ID. Некоторые сведения были удалены для ясности. Some details have been removed for clarity.

В предыдущем примере каждое из полей, оканчивающихся на Uri , соответствует встроенному API HTTP. In the previous example, each of the fields ending in Uri corresponds to a built-in HTTP API. Эти API можно использовать для управления целевым экземпляром оркестрации. You can use these APIs to manage the target orchestration instance.

Формат URL-адресов веб перехватчика зависит от версии используемого узла функций Azure. The format of the webhook URLs depends on which version of the Azure Functions host you are running. Предыдущий пример относится к узлу функции Azure 2,0. The previous example is for the Azure Functions 2.0 host.

Описание всех встроенных API HTTP см. в справочнике по API HTTP. For a description of all built-in HTTP APIs, see the HTTP API reference.

Отслеживание асинхронных операций Async operation tracking

Упомянутый ранее HTTP-ответ предназначен для помощи в реализации долго выполняющихся асинхронных API-интерфейсов HTTP с устойчивыми функциями. The HTTP response mentioned previously is designed to help implement long-running HTTP async APIs with Durable Functions. Этот шаблон иногда называют шаблоном объекта-получателя опроса. This pattern is sometimes referred to as the polling consumer pattern. Поток клиента или сервера работает следующим образом: The client/server flow works as follows:

  1. Клиент отправляет запрос HTTP для запуска длительного процесса, например, функции Orchestrator. The client issues an HTTP request to start a long-running process like an orchestrator function.
  2. Целевой триггер HTTP возвращает ответ HTTP 202 с заголовком Location со значением «statusQueryGetUri». The target HTTP trigger returns an HTTP 202 response with a Location header that has the value «statusQueryGetUri».
  3. Клиент опрашивает URL-адрес в заголовке Location. The client polls the URL in the Location header. Клиент продолжит видеть ответы HTTP 202 с заголовком Location. The client continues to see HTTP 202 responses with a Location header.
  4. Когда экземпляр завершается или завершается ошибкой, конечная точка в заголовке Location возвращает HTTP 200. When the instance finishes or fails, the endpoint in the Location header returns HTTP 200.

Этот протокол обеспечивает координацию длительно выполняющихся процессов с внешними клиентами или службами, которые могут опрашивать конечную точку HTTP и следовать заголовку Location. This protocol allows coordination of long-running processes with external clients or services that can poll an HTTP endpoint and follow the Location header. Серверные и клиентские реализации этого шаблона встроены в API-интерфейсы Устойчивые функции HTTP. Both the client and server implementations of this pattern are built into the Durable Functions HTTP APIs.

По умолчанию все действия на основе HTTP, предоставляемые Azure Logic Apps, поддерживают стандартную модель асинхронных операций. By default, all HTTP-based actions provided by Azure Logic Apps support the standard asynchronous operation pattern. Эта возможность позволяет внедрять долго выполняющиеся устойчивые функции в рамках рабочего процесса Logic Apps. This capability makes it possible to embed a long-running durable function as part of a Logic Apps workflow. Дополнительные сведения о Logic Apps поддержки для асинхронных шаблонов HTTP см. в документации по действиям и триггерам рабочего процесса Azure Logic Apps. You can find more details on Logic Apps support for asynchronous HTTP patterns in the Azure Logic Apps workflow actions and triggers documentation.

Взаимодействие с оркестрации можно выполнять из любого типа функции, а не только с помощью функций, активируемых HTTP. Interactions with orchestrations can be done from any function type, not just HTTP-triggered functions.

Дополнительные сведения об управлении согласованиями и сущностями с помощью клиентских API см. в статье Управление экземплярами. For more information on how to manage orchestrations and entities using client APIs, see the Instance management article.

Использование API-интерфейсов HTTP Consuming HTTP APIs

Как описано в статье ограничения кода функции Orchestrator, функции Orchestrator не могут выполнять операции ввода-вывода напрямую. As described in the orchestrator function code constraints, orchestrator functions can’t do I/O directly. Вместо этого они обычно вызывают функции действий , которые выполняют операции ввода-вывода. Instead, they typically call activity functions that do I/O operations.

Начиная с Устойчивые функции 2,0, оркестрации могут использовать API-интерфейсы HTTP с помощью привязки триггера оркестрации. Starting with Durable Functions 2.0, orchestrations can natively consume HTTP APIs by using the orchestration trigger binding.

Возможность вызова конечных точек HTTP непосредственно из функций Orchestrator пока недоступна в JavaScript. The ability to call HTTP endpoints directly from orchestrator functions is not yet available in JavaScript.

В следующем примере кода показана C# функция Orchestrator, выполняющая исходящий HTTP-запрос с помощью API каллхттпасинк .NET. The following example code shows a C# orchestrator function making an outbound HTTP request using the CallHttpAsync .NET API:

С помощью действия Call HTTP можно выполнять следующие действия в функциях Orchestrator: By using the «call HTTP» action, you can do the following actions in your orchestrator functions:

  • Вызывайте API HTTP непосредственно из функций оркестрации с некоторыми ограничениями, упомянутыми позже. Call HTTP APIs directly from orchestration functions, with some limitations that are mentioned later.
  • Автоматически поддерживает шаблоны опроса состояния HTTP 202 на стороне клиента. Automatically support client-side HTTP 202 status polling patterns.
  • Используйте управляемые удостоверения Azure для выполнения санкционированных вызовов HTTP к другим конечным точкам Azure. Use Azure Managed Identities to make authorized HTTP calls to other Azure endpoints.

Возможность использования API-интерфейсов HTTP непосредственно из функций Orchestrator предназначена для удобства работы с определенным набором распространенных сценариев. The ability to consume HTTP APIs directly from orchestrator functions is intended as a convenience for a certain set of common scenarios. Все эти функции можно реализовать самостоятельно с помощью функций действий. You can implement all of these features yourself using activity functions. Во многих случаях функции действий могут обеспечить большую гибкость. In many cases, activity functions might give you more flexibility.

Обработка HTTP 202 HTTP 202 handling

API «Call HTTP» может автоматически реализовать клиентскую сторону шаблона опрашивающего потребителя. The «call HTTP» API can automatically implement the client side of the polling consumer pattern. Если вызываемый API возвращает ответ HTTP 202 с заголовком Location, функция Orchestrator автоматически опрашивает ресурс расположения, пока не получит ответ, отличный от 202. If a called API returns an HTTP 202 response with a Location header, the orchestrator function automatically polls the Location resource until receiving a response other than 202. Ответ будет возвращен в код функции Orchestrator. This response will be the response returned to the orchestrator function code.

Функции Orchestrator также изначально поддерживают клиентский шаблон опроса на стороне сервера, как описано в разделе Отслеживание асинхронных операций. Orchestrator functions also natively support the server-side polling consumer pattern, as described in Async operation tracking. Такая поддержка означает, что согласование в одном приложении функции может легко координировать функции Orchestrator в других приложениях функций. This support means that orchestrations in one function app can easily coordinate the orchestrator functions in other function apps. Это похоже на концепцию подсистемы оркестрации , но с поддержкой взаимодействия между приложениями. This is similar to the sub-orchestration concept, but with support for cross-app communication. Эта поддержка особенно полезна при разработке приложений в стиле микрослужб. This support is particularly useful for microservice-style app development.


Управляемые удостоверения Managed identities

Устойчивые функции изначально поддерживает вызовы API, которые принимают маркеры Azure Active Directory (Azure AD) для авторизации. Durable Functions natively supports calls to APIs that accept Azure Active Directory (Azure AD) tokens for authorization. Эта поддержка использует управляемые удостоверения Azure для получения этих маркеров. This support uses Azure managed identities to acquire these tokens.

Следующий код является примером функции .NET Orchestrator. The following code is an example of a .NET orchestrator function. Функция выполняет проверку подлинности вызовов для перезапуска виртуальной машины с помощью Azure Resource Manager виртуальных машин REST API. The function makes authenticated calls to restart a virtual machine by using the Azure Resource Manager virtual machines REST API.

В предыдущем примере параметр tokenSource настроен для получения маркеров Azure AD для Azure Resource Manager. In the previous example, the tokenSource parameter is configured to acquire Azure AD tokens for Azure Resource Manager. Токены идентифицируются с помощью URI ресурса https://management.core.windows.net . The tokens are identified by the resource URI https://management.core.windows.net . В этом примере предполагается, что текущее приложение-функция выполняется локально или развернуто как приложение-функция с управляемым удостоверением. The example assumes that the current function app either is running locally or was deployed as a function app with a managed identity. Предполагается, что локальным удостоверением или управляемым удостоверением предоставлено разрешение на управление виртуальными машинами в указанной группе ресурсов myRG . The local identity or the managed identity is assumed to have permission to manage VMs in the specified resource group myRG .

Во время выполнения настроенный источник токена автоматически возвращает маркер доступа OAuth 2,0. At runtime, the configured token source automatically returns an OAuth 2.0 access token. Затем источник добавляет маркер в качестве токена носителя в заголовок авторизации исходящего запроса. The source then adds the token as a bearer token to the Authorization header of the outgoing request. Эта модель является улучшением по сравнению с добавлением заголовков авторизации вручную в HTTP-запросы по следующим причинам. This model is an improvement over manually adding authorization headers to HTTP requests for the following reasons:

  • Обновление токена обрабатывается автоматически. Token refresh is handled automatically. Вам не нужно беспокоиться о токенах с истекшим сроком действия. You don’t need to worry about expired tokens.
  • Токены никогда не хранятся в состоянии устойчивого оркестрации. Tokens are never stored in the durable orchestration state.
  • Вам не нужно писать код для управления получением маркера. You don’t need to write any code to manage token acquisition.

Более полный пример можно найти в примере предварительно C# скомпилированного рестартвмс. You can find a more complete example in the precompiled C# RestartVMs sample.

Управляемые удостоверения не ограничиваются управлением ресурсами Azure. Managed identities aren’t limited to Azure resource management. Управляемые удостоверения можно использовать для доступа к любому API, который принимает токены носителя Azure AD, включая службы Azure из Майкрософт и веб-приложения от партнеров. You can use managed identities to access any API that accepts Azure AD bearer tokens, including Azure services from Microsoft and web apps from partners. Веб-приложение партнера может даже быть другим приложением-функцией. A partner’s web app can even be another function app. Список служб Azure, которые поддерживают проверку подлинности в Azure AD, см. в статье службы Azure, поддерживающие аутентификацию Azure AD. For a list of Azure services from Microsoft that support authentication with Azure AD, see Azure services that support Azure AD authentication.

Ограничения Limitations

Встроенная поддержка вызова API-интерфейсов HTTP является удобной функцией. The built-in support for calling HTTP APIs is a convenience feature. Это не подходит для всех сценариев. It’s not appropriate for all scenarios.

HTTP-запросы, отправленные функциями Orchestrator и их ответами, сериализуются и сохраняются как сообщения очереди. HTTP requests sent by orchestrator functions and their responses are serialized and persistent as queue messages. Такое поведение очередей гарантирует надежность и безопасность HTTP-вызовов при воспроизведении оркестрации. This queueing behavior ensures HTTP calls are reliable and safe for orchestration replay. Однако поведение очереди также имеет ограничения. However, the queuing behavior also has limitations:

  • Каждый HTTP-запрос требует дополнительной задержки по сравнению с собственным HTTP-клиентом. Each HTTP request involves additional latency when compared to a native HTTP client.
  • Большие сообщения запроса или ответа, которые не могут поместиться в очередь, могут значительно снизить производительность оркестрации. Large request or response messages that can’t fit into a queue message can significantly degrade orchestration performance. Накладные расходы на разгрузку полезных данных сообщений в хранилище BLOB-объектов могут привести к снижению производительности. The overhead of offloading message payloads to blob storage can cause potential performance degradation.
  • Потоковая передача, фрагментированность и двоичные данные не поддерживаются. Streaming, chunked, and binary payloads aren’t supported.
  • Возможность настройки поведения клиента HTTP ограничена. The ability to customize the behavior of the HTTP client is limited.

Если какое-либо из этих ограничений может повлиять на ваш вариант использования, вместо этого следует использовать функции действий и клиентские библиотеки HTTP, зависящие от языка, для выполнения исходящих вызовов HTTP. If any of these limitations might affect your use case, consider instead using activity functions and language-specific HTTP client libraries to make outbound HTTP calls.

Если вы являетесь разработчиком .NET, то можете спросить, почему эта функция использует типы дураблехттпрекуест и дураблехттпреспонсе вместо встроенных типов .NET HttpRequestMessage и HttpResponseMessage . If you are a .NET developer, you might wonder why this feature uses the DurableHttpRequest and DurableHttpResponse types instead of the built-in .NET HttpRequestMessage and HttpResponseMessage types.

Этот вариант разработки является намеренным. This design choice is intentional. Основная причина заключается в том, что пользовательские типы помогают убедиться в том, что пользователи не делают неправильные предположения о поддерживаемых поведениях внутреннего HTTP-клиента. The primary reason is that custom types help ensure users don’t make incorrect assumptions about the supported behaviors of the internal HTTP client. Типы, характерные для Устойчивые функции, позволяют упростить разработку API. Types specific to Durable Functions also make it possible to simplify API design. Они также могут упростить доступ к специальным функциям, таким как Интеграция управляемой идентификации и шаблон опрашивающего потребителя. They also can more easily make available special features like managed identity integration and the polling consumer pattern.

Расширяемость (только .NET) Extensibility (.NET only)

Настройка поведения внутреннего HTTP-клиента оркестрации возможна с помощью внедрения зависимостей .NET для функций Azure. Customizing the behavior of the orchestration’s internal HTTP client is possible using Azure Functions .NET dependency injection. Эта возможность может быть полезной для внесения небольших изменений в поведение. This ability can be useful for making small behavioral changes. Он также может быть полезен для модульного тестирования HTTP-клиента путем внедрения макетов объектов. It can also be useful for unit testing the HTTP client by injecting mock objects.

В следующем примере демонстрируется использование внедрения зависимостей для отключения проверки SSL-сертификата для функций Orchestrator, вызывающих внешние конечные точки HTTP. The following example demonstrates using dependency injection to disable SSL certificate validation for orchestrator functions that call external HTTP endpoints.

Интернет технологии (архив 2001-2010)

Служба WWW (World Wide Web) — предназначена для обмена гипертекстовой информацией.

Проект был предложен в 1989 году. В 1993 появился первый браузер.

WWW построена по схеме «клиент-сервер».

Браузер (Internet Explorer, Opera . ) является мультипротокольным клиентом и интерпретатором HTML. И как типичный интерпретатор, клиент в зависимости от команд (тегов) выполняет различные функции. В круг этих функций входит не только размещение текста на экране, но обмен информацией с сервером по мере анализа полученного HTML-текста, что наиболее наглядно происходит при отображении встроенных в текст графических образов.

Сервер HTTP (Apeche, IIS . ) обрабатывает запросы клиента на получение файла (в самом простом случае).

Взаимодействие клиент и сервера по протоколу HTTP.

В начале служба WWW базировалась на трех стандартах:

HTML (HyperText Markup Lan-guage) — язык гипертекстовой разметки документов ;

URL (Universal Resource Locator) — универсальный способ адресации ресурсов в сети ;

HTTP (HyperText Transfer Protocol) — протокол обмена гипертекстовой информацией.

CGI (Common Gateway Interface) — универсальный интерфейс шлюзов. Создан для взаимодействия HTTP — сервера с другими программами, установленными на сервере (например, СУБД).

Первый документ (но не стандарт) — RFC1945 (Hypertext Transfer Protocol — HTTP/1.0 T. Berners-Lee, R. Fielding, H. Frystyk May 1996)

Последняя версия — RFC2616 (Hypertext Transfer Protocol — HTTP/1.1 R. Fielding, J. Gettys, J. Mogul, H. Frystyk, L. Masinter, P. Leach, T. Berners-Lee June 1999)

Hypertext Transfer Protocol — протокол передачи гипертекста, протокол высокого уровня (а именно, уровня приложений).
. Используется службой WWW для передачи Web-страниц.

Протокол HTTP определяет запрос-ответный способ взаимодействия между программой-клиентом и программой-сервером в рамках технологии World Wide Web. Ниже приведены примеры запроса клиента и ответа сервера:

Листинг запроса и ответа HTTP

Установка соединения
Connecting to ipm.kstu.ru .
Connected to ipm.kstu.ru [195.208.44.20]

Запрос клиента:
GET /internet/index.php HTTP/1.1 — (запрос файла и указание протокола HTTP/1.1)
Connection: close — (закрыть соединение после отправки файла)
Host: ipm.kstu.ru — (указание адреса сервера)
Accept: */* — (предпочтение типов данных)
Cache-Control: no-cache — (не кешировать)
Referer: http://ipm.kstu.ru/internet/ — (от куда пришел клиент)
User-Agent: Mozilla/4.0 (compatible; MSIE 4.01; Windows 95) — (название программы клиента)

Илон Маск рекомендует:  Глава 4 сортировка

Ответ сервера
HTTP/1.0 200 OK — (какой протокол используется, 200 — означает, что файл найден)
Date: Wed, 23 Oct 2002 08:32:31 GMT — (дата и время ответа)
Server: Apache/1.3.26 (Unix) PHP/4.1.2 rus/PL30.15 — (название, версия и модули http-сервера)
X-Powered-By: PHP/4.1.2 — (чем создана страница)
Connection: close — (закрыть соединение после получения файла)
Content-Type: text/html; charset=windows-1251 — (тип данных html, кодировка windows-1251)

Дальше идет содержимое файла (тело запроса).

Работа по протоколу HTTP происходит следующим образом: программа-клиент устанавливает TCP-соединение с сервером (стандартный номер порта-80) и выдает ему HTTP-запрос. Сервер обрабатывает этот запрос и выдает HTTP-ответ клиенту.

HTTP-запрос состоит из заголовка запроса и тела запроса, разделенных пустой строкой. Тело запроса может отсутствовать.

Заголовок запроса состоит из главной (первой) строки запроса и последующих строк, уточняющих запрос в главной строке. Последующие строки также могут отсутствовать.

Запрос в главной строке состоит из трех частей, разделенных пробелами:

1) Метод (иначе говоря, команда HTTP):

GET — Метод GET служит для получения любой информации, в соответствии URI-запроса.

HEAD — запрос заголовка документа. Отличается от GET тем, что выдается только заголовок запроса с информацией о документе. Сам документ не выдается.

POST — этот метод применяется для передачи данных CGI-скриптам. Сами данные следуют в последующих строках запроса в виде параметров.


PUT — поместить документ на сервере. Запрос с этим методом имеет тело, в котором передается сам документ.

DELETE — используется для удаления ресурсов, идентифицированных с помощью URI-запроса

2) Ресурс — это путь к определенному файлу на сервере (называется URI), который клиент хочет получить (или разместить — для метода PUT). Если ресурс — просто какой-либо файл для считывания, сервер должен по этому запросу выдать его в теле ответа. Если же это путь к какому-либо CGI-скрипту, то сервер запускает скрипт и возвращает результат его выполнения. Кстати, благодаря такой унификации ресурсов для клиента практически безразлично, что он представляет собой на сервере.

3) Версия протокола — версия протокола HTTP, с которой работает клиентская программа.

Строки после главной строки запроса имеют следующий формат:

Таким образом, задаются параметры запроса. Это является необязательным, все строки после главной строки запроса могут отсутствовать; в этом случае сервер принимает их значение по умолчанию или по результатам предыдущего запроса (при работе в режиме Keep-Alive).

6.2.1 Некоторые параметры HTTP-запроса:

Connection (соединение) — может принимать значения Keep-Alive и close. Keep-Alive («оставить в живых») означает, что после выдачи данного документа соединение с сервером не разрывается, и можно выдавать еще запросы. Большинство браузеров работают именно в режиме Keep-Alive, так как он позволяет за одно соединение с сервером «скачать» html-страницу и рисунки к ней. Будучи однажды установленным, режим Keep-Alive сохраняется до первой ошибки или до явного указания в очередном запросе Connection: close.
close («закрыть») — соединение закрывается после ответа на данный запрос.

User-Agent — значением является «кодовое обозначение» браузера, например:

Mozilla/4.0 (compatible; MSIE 5.0; Windows 95; DigExt)

Accept — список поддерживаемых браузером типов содержимого в порядке их предпочтения данным браузером, например:

Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/vnd.ms-excel, application/msword, application/vnd.ms-powerpoint, */*

Это, очевидно, нужно для случая, когда сервер может выдавать один и тот же документ в разных форматах.

Значение этого параметра используется в основном CGI-скриптами для формирования ответа, адаптированного для данного браузера.

Referer — URL, с которого перешли на этот ресурс.

Host — имя хоста, с которого запрашивается ресурс. Полезно, если на сервере имеется несколько виртуальных серверов под одним IP-адресом. В этом случае имя виртуального сервера определяется по этому полю.

Accept-Language — поддерживаемый язык. Имеет значение для сервера, который может выдавать один и тот же документ в разных языковых версиях.

Формат ответа очень похож на формат запроса: он также имеет заголовок и тело, разделенное пустой строкой.

Заголовок также состоит из основной строки и строк параметров, но формат основной строки отличается от таковой в заголовке запроса.

Основная строка запроса состоит из 3-х полей, разделенных пробелами:

Версия протокола — аналогичен соответствующему параметру запроса.

6.2.3 Код возврата (ошибки, состояния) кодовое обозначение «успешности» выполнения запроса.

Например, код 200 означает «все нормально» (OK).

Значения кодов возврата по первой цифре:
1xx: Информационный — Не используется, но зарезервирован для использования в будущем
2xх: Успех — Запрос был полностью получен, понят, и принят к обработке.
3xx: Перенаправление — Клиенту следует предпринять дальнейшие действия для успешного выполнения запроса. Необходимое дополнительное действие иногда может быть выполнено клиентом без взаимодействия с пользователем, но настоятельно рекомендуется, чтобы это имело место только в тех случаях, когда метод, использующийся в запросе безразличен (GET или HEAD).
4xx: Ошибка клиента — Запрос, содержащий неправильные синтаксические конструкции, не может быть успешно выполнен. Класс 4xx предназначен для описания тех случаев, когда ошибка была допущена со стороны клиента. Если клиент еще не завершил запрос, когда он получил ответ с Статус-Кодом- 4xx, он должен немедленно прекратить передачу данных серверу. Данный тип Статус-Кодов применим для любых методов, употребляющихся в запросе.
5xx: Ошибка Сервера — Сервер не смог дать ответ на корректно поставленный запрос. В этих случаях сервер либо знает, что он допустил ошибку, либо не способен обработать запрос. За исключением ответов на запросы HEAD, сервер посылает описание ошибочной ситуации и то, является ли это состояние временным или постоянным, в Содержание-Ответа. Данный тип Статус-Кодов применим для любых методов, употребляющихся в запросе.

Наиболее часто встречающиеся:
«200»; OK — документ отправлен.
«404»; Not Found — документ не найден (ошибка URL), клиент должен проверить правильность написания URL, если не помогает, значит, документ уже удален.
«500»; Internal Server Error — внутренняя ошибка сервера, клиент исправить не может, только администратор сервера.

Словесное описание ошибки — «расшифровка» предыдущего кода. Например, для 200 это OK, для 500 — Internal Server Error.

Таблица кодов возврата

Код Название Описание
100 Продолжайте Клиент должен продолжать передачу запроса.
101 Переключение протоколов Сервер предлагает изменить протокол на указанный в поле заголовка отклика Update. Обычно это предложение о переходе на более новую версию HTTP.
110 Отклик мог устареть Отклик является устаревшим (используется в заголовке Warning).
111 Обновление не удалось Отклик от кэша не является свежим, т. к. попытка обновить его закончилась неудачей (используется в заголовке Warning).
112 Разрыв соединения Кэш был умышленно отсоединен от остальной сети на некоторое время (используется в заголовке Warning).
113 Эвристическое устаревание Кэш эвристически выбрал период обновления, больший 24 часов, и возраст отклика более 24 часов (используется в заголовке Warning).
199 Различные предупреждения Дополнительные предупреждения, не содержащиеся в данном списке (используется в заголовке Warning).
200 OK Запрос был успешно обработан. Содержимое отклика зависит от типа запроса.
201 Создано Запрос был успешно обработан и в результате был создан новый ресурс. Его URI указан в поле заголовка отклика Location.
202 Принято Запрос был принят, и его обработка началась другим асинхронным процессом, поэтому сервер не сможет сообщить о ее завершении.
203 Неавторитетная информация Возвращаемая метаинформация получена не от сервера ее происхождения, а из локальной копии.
204 Нет содержимого Сервер выполнил запрос, но ему нечего возвращать клиенту. Обозреватель не должен изменять отображение документа.
205 Сброс содержимого Сервер выполнил запрос, и обозреватель должен сбросить отображение документа.
206 Частичное содержимое Сервер выполнил частичный запрос GET для ресурса.
214 Применено преобразование Применено преобразование, изменившее кодировку или тип MIME отклика (используется в заголовке Warning).
299 Различные настойчивые предупреждения Дополнительные предупреждения, не содержащиеся в данном списке (используется в заголовке Warning).
300 Несколько вариантов Запрошенный ресурс имеет несколько представлений, и клиент должен выбрать одно из них.
301 Ресурс перенесен Запрошенный ресурс сменил свой URI. Его новый URI указан в поле заголовка отклика Location.
302 Найдено Запрошенный ресурс временно сменил свой URI.
303 Смотри другое Отклик на данный запрос может быть найден под другим URI, указанным в поле заголовка отклика Location.
304 Не изменено Клиент выполнил условный запрос GET, доступ разрешен, но документ не был изменен.
305 Используйте прокси Доступ к запрошенному ресурсу возможен только через прокси-сервер, указанный в поле заголовка отклика Location.
306 зарезервирован
307 Временное перенаправление Запрошенный ресурс временно находится под другим URI, указанном в поле заголовка отклика Location.
400 Неверный запрос Запрос не был понят сервером из-за его неверного синтаксиса.
401 Нет права доступа Запрос требует авторизации доступа, тип которой указан в поле заголовка отклика WWW-Authenticate.
402 Требуется платеж Зарезервировано для следующих версий HTTP.
403 Запрещено Сервер понял запрос, но отказался его выполнять.
404 Не найдено Ресурс, заданный в URI запроса, не найден.
405 Недопустимый метод Данный тип запроса не применим к ресурсу, заданному в URI запроса.
406 Неприемлемо Ресурс, заданный в URI запроса, может генерировать только отклики, не приемлемые для клиента.
407 Прокси требует авторизации доступа Прокси-сервер требует авторизации доступа, тип которой указан в поле заголовка отклика Proxy-Authenticate.
408 Таймаут запроса Клиент не послан ни одного запроса в течение отведенного ему интервала.
409 Конфликт Запрос не может быть выполнен из-за конфликта с текущим состоянием ресурса.
410 Ресурс исчез Запрошенного ресурса больше нет на сервере, и сервер не знает его нового URI.
411 Требуется длина запроса В запросе не задано поле заголовка Content-Length.
412 Условие ложно Условие, заданное в заголовке условного запроса, не может быть выполнено.
413 Слишком длинное тело запроса Тело запроса длиннее, чем допускает сервер.
414 Слишком длинное URI запроса URI запроса длиннее, чем допускает сервер.
415 Не поддерживаемый тип устройства Формат тела запроса не поддерживается данным ресурсом для данного типа запроса.
416 Запрошенный диапазон пуст Запрошенный ресурс не содержит значений в диапазоне, заданном в поле заголовка запроса Range.
417 Предположение не оправдалось Предположение, указанное в поле заголовка запроса Expect, отвергнуто сервером.
500 Внутренняя ошибка сервера Запрос не исполнен из-за неожиданной ошибки сервера.
501 Не реализовано Сервер не поддерживает данный тип запросов.
502 Плохой шлюз Сервер, выступающий в роли шлюза или прокси-сервера, получил неверный отклик от следующего сервера.
503 Служба недоступна Сервер временно не может исполнить запрос из-за перегрузки.
504 Таймаут шлюза Сервер, выступающий в роли шлюза или прокси-сервера, не получил своевременного отклика от следующего сервера.
505 Версия HTTP не поддерживается Сервер не поддерживает версию HTTP, указанную в заголовке запроса.

6.2.3 Некоторые параметры http-ответа:

Connection — этот ответ аналогичен соответствующему параметру запроса.

Если сервер не поддерживает Keep-Alive (есть и такие серверы), то значение Connection в ответе всегда close.

Content-Type — содержит обозначение типа содержимого ответа в MIME.

В зависимости от значения Content-Type браузер воспринимает ответ как HTML-страницу, картинку gif или jpeg, как файл, который надо сохранить на диске, или как что-либо еще и предпринимает соответствующие действия.

Некоторые типы содержимого:

text/html — текст в формате HTML (веб-страница);
text/plain — простой текст (аналогичен «блокнотовскому»);
image/jpeg — картинка в формате JPEG;
image/gif — то же, в формате GIF;

Также может передавать кодировку для текстовых данных.

Content-Length — длина содержимого ответа в байтах (размер файла).

Last-Modified — дата и время последнего изменения документа.

6.2.4 Соединение к HTTP с помощью Telnet

Подсоединимся к командному порту HTTP (80), и запросим файл robots.txt:

6.3 Программа TeleportPro.

Бывают ситуации, когда необходимо работать с информацией с локального диска, например:

отсутствие доступа в Internet.

очень медленный канал.

очень большое количество документов.

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

для экономии при оплате канала, при выходе по модему.

Для создания локальной копии сайта или части сайта, существуют специальные программы. Одна из них TeleportPro. Сервер разработчика http://www.tenmax.com/ .

Некоторые возможности программы:

задание глубины сканирования сайта, и внешних ссылок


задание типа файлов (расширение) для скачивания, например можно скачать только графику.

выставить лимит по размеру файла.

сканирование графических карт.

задание расписания работы, встроенный Scheduler.

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

задание количества одновременно скачиваемых файлов.

Генерация HTTP запросов

1. Протокол HTTP. Введение

Сразу хочу уточнить одну маленькую вещь. Страшное слово протокол есть не что иное, как соглашение множества людей, просто в один прекрасный момент люди решили: «Давайте будем делать так, и тогда все будет в порядке». Бояться нечего, все просто до безобразия и это безобразие мы сейчас будем вскрывать. Итак, что же это такое протокол HTTP и с чем его едят?

1.1 Клиент и сервер

Чудес в мире, а тем более в мире программизма и интернета не бывает! Усвойте это как незыблемую истину. И, если программа не работает или работает не так как хочется, то, значит, скорее всего, она либо написана не правильно, либо содержит ошибки. Итак, как же все-таки браузер просит сервер прислать ему хоть что-нибудь? Да очень просто! Надо только немного расслабиться и начать получать удовольствие от процесса ��

1.2. Пишем наш первый HTTP запрос

Если Вы думаете, что все слишком сложно, то Вы ошибаетесь. Человек так устроен, что просто не способен создавать что-то сложное, иначе он сам в этом запутается �� Итак, есть браузер и есть Web-сервер. Инициатором обмена данными всегда выступает браузер. Web-сервер никому, никогда просто так ничего не пошлет, чтобы он что-нибудь отправил браузеру — надо, чтобы браузер об этом попросил. Простейший HTTP запрос моет выглядеть, например, так:

* GET (В переводе с английского означает «получить») — тип запроса, тип запроса может быть разным, например POST, HEAD, PUT, DELETE (часть из них мы рассмотрим ниже).
* http://www.php.net/ — URI (адрес) от которого мы хотим получить хоть какую-нибудь информацию (естественно мы надеемся подучить HTML страницу).
* HTTP/1.0 — тип и версия протокола, который мы будем использовать в процессе общения с сервером.
* rn — конец строки, который необходимо повторить два раза, зачем, станет понятно немного позднее.

Вы можете выполнить данный запрос очень просто. Запустите программу telnet.exe, введите в качестве хоста www.php.net, укажите порт 80, и просто наберите данный запрос, нажав два раза Enter в качестве rnrn. В ответ вы получите HTML код главной страницы сайта www.php.net.

1.3 Структура запроса

Рассмотрим, из чего состоит HTTP запрос. Все достаточно просто. Начнем с того, что HTTP запрос — это вполне осмысленный текст. Из чего же он состоит в общем случае? Будем рассматривать протокол HTTP 1.0. Итак:

* Request-Line — строка запроса
*

Формат: «Method Request-URI HTTP-Versionrn»
* Method — метод, которым будет обрабатываться ресурс Request-URI, может быть GET, POST, PUT, DELETE или HEAD.
* Request-URI — относительная или абсолютная ссылка на страницу с набором параметров, например, /index.html или http://www.myhost.ru/index.html или /index.html?a=1&b=qq. В последнем случае серверу будет передан запрос с набором переменных a и b с соответствующими значениями, а знак «&» — амперсант служит разделителем между параметрами.
* HTTP-Version — версия HTTP протокола, в нашем случае «HTTP/1.0».

Нам крайне интересны методы обработки GET и POST. Методом GET можно просто передать параметры в скрипт, а методом POST можно эмулировать submit формы.

Для метода GET, Request-URI может выглядеть, например, так: «/index.html?param1=1&param2=2».

* General-Header — главная часть заголовка.
Формат: [Date: valuen | Pragma: no-cachen]
Может иметь только два параметра: Date или Pragma. Date — дата по Гринвичу в формате «День недели, Число Месяц Год ЧЧ:ММ:СС GMT», например, «Tue, 15 Nov 1994 08:12:31 GMT» — дата создания запроса. Pragma может иметь одно значение no-cache, которое запрещает кэширование страницы.

* Request-Header — часть заголовка, описывающая запрос.

Request-Header может иметь следующие параметры: Allow, Authorization, From, If-Modified-Since, Referer, User-Agent.
В данной главе мы не будем рассматривать параметр Autorization, так как он используется для доступа к закрытым ресурсам, что требуется не так уж часто. Вы можете самостоятельно изучить формирование заголовка для авторизованного доступа на сайте www.w3c.org.

* Allow — задает допустимые методы обработки.
Формат: «Allow: GET | HEADn».
Параметр игнорируется при указании метода обработки POST в Request-Line. Задает допустимые методы обработки запроса. Прокси сервера не модифицируют параметр Allow и он в неизменном виде доходит до сервера.

* From — e-mail адрес, пославшего запрос.
Формат: «From: adderssrn».
Например, «From: myname@mailserver.rurn».

* If-Modified-Since — указывает, что запрос не модифицировался с такого-то времени.
Формат: «If-Modified-Since: datern»
Используется только для метода обработки GET. Дата указывается по Гринвичу в таком же формате, как и для параметра Date в General-Header.

* Referrer — абсолютная ссылка на страницу, с которой произошла инициация запроса, т. е. ссылка на страницу, с которой пользователь перешел на нашу.
Формат: «Referrer: urln».
Пример: «Referrer: www.host.ru/index.htmln».
* User-Agent — тип браузера.
Например: «User-Agent: Mozilla/4.0n»

* Entity-Header — часть заголовка, описывающая данные Entity-Body.
В данной части запроса задаются параметры, которые описывают тело страницы. Entity-Header может содержать следующие параметры: Allow, Content-Encoding, Content-Length, Content-Type, Expires, Last-Modified, extension-header.

* Allow — параметр аналогичный Allow из General-Header.

* Content-Encoding — тип кодирования данных Entity-Body.
Формат: «Сontent-Encoding: x-gzip | x-compress | другой типn».
Пример: «Сontent-Encoding: x-gzipn». Символ «|» означает слово «или», то есть то или то или то и.т.д.
Другой тип может указывать на способ кодирования данных, например, для метода POST: «Сontent-Encoding: application/x-www-form-urlencodedn».

* Content-Length — количество байт, пересылаемых в Entity-Body. Значение Content-Length имеет совсем другой смысл для данных, пересылаемых в формате MIME, где он выступает как параметр описания части данных — «external/entity-body». Допустимыми являются целые числа от нуля и больше.
Пример: «Content-Length: 26457n».

* Content-Type — тип передаваемых данных.
Например: «Content-Type: text/htmln».

* Expires — Время, когда страница должна быть удалена из кэша браузера.
Формат: «Expires: daten». Формат даты алогичен формату даты для параметра Date из General-Header.

* Last-Modified — время последнего изменения пересылаемых данных.
Формат: «Last-Modified: daten». Формат даты алогичен формату даты для параметра Date из General-Header.

* Extention-header — часть заголовка, которая может предназначаться, например, для обработки браузером, или другой программой, которая принимает документ. В данной части можно описывать свои параметры в формате «ParameterName: parametervaluen». Данные параметры будут игнорироваться, если программа-клиент не знает, как их обработать.
Например: «Cookie: r=1rn» — устанавливает всем известные печеньки для страницы.

А теперь после таких страшных слов давайте попробуем немного успокоиться и понять, что же нам надо? Понимать мы естественно будем на примерах.

Давайте представим, что нам надо получить страницу с сайта, передав Cookies (Печеньки), иначе нас просто пошлют как незванных гостей, и более того, известно, что на данную страницу пускают только после того, как Вы побывали на главной странице сайта.

Напишем наш запрос.

Данный запрос говорит нам о том, что мы хотим получить содержимое страницы по адресу http://www.site.ru/news.html, использую метод GET. Поле Host говорит о том, что данная страница находится на сервере www.site.ru, поле Referer говорит о том, что за новостями мы пришли с главной страницы сайта, а поле Cookie говорит о том, что нам была присвоена такая-то кука. Почему так важны поля Host, Referer и Сookie? Потому что нормальные программисты при создании динамических сайтов проверяют данные поля, которые появляются в скриптах (РНР в том числе) в виде переменных. Для чего это надо? Для того, например, чтобы сайт не грабили, т.е. не натравливали на него программу для автоматического скачивания, или для того, чтобы зашедший на сайт человек всегда попадал бы на него только с главной страницы и.т.д.

Теперь давайте представим, что нам надо заполнить поля формы на странице и отправить запрос из формы, пусть в данной форме будет два поля: login и password (логин и пароль),- и, мы естественно знаем логин и пароль.

Логин у нас «Petya Vasechkin» Почему же мы должны писать Petya%20Vasechkin? Это из=за того, что специальные символы могут быть распознаны сервером, как признаки наличия нового параметра или конца запроса и.т.д. Поэтому существует алгоритм кодирования имен параметров и их значений, во избежание оштбочных ситуаций в запросе. Полное описание данного алгоритма можно найти здесь, а в PHP есть функции rawurlencode и rawurldecode для кодирования и декодирования соответственно. Хочу отметеить, что декодирование РНР делает сам, если в запросе были переданы закодированные параметры. На этом я закону первую главу знакомства c протоколом HTTP. В следуючей главе мы рассмотрим построение запросов типа POST (в переводе с английского — «отправить»), что будет гораздо интереснее, т.к. именно данный тип запросов используется при отправке данных из HTML форм.

В случае HTTP запроса типа POST существует два варианта передачи полей из HTML форм, а именно, используя алгоритм application/x-www-form-urlencoded и multipart/form-data. Различия между данными алгоритмами весьма существенные. Дело в том, что алгоритм первого типа создавался давным-давно, когда в языке HTML еще не предусматривали возможность передачи файлов через HTML формы. Итак, давайте рассмотрим эти алгоритмы на примерах.

3.1 Content-Type: application/x-www-form-urlencoded.

Пишем запрос, аналогичный нашему запросу GET для передачи логина и пароля, который был рассмотрен в предыдущей главе:

Здесь мы видим пример использования Content-Type и Content-Length полей заголовка. Content-Length говорит, сколько байт будет занимать область данных, которая отделяется от заголовка еще одним переводом строки rn. А вот параметры, которые раньше для запроса GET помещались в Request-URI, теперь находятся в Entity-Body. Видно, что они формируются точно также, просто надо написать их после заголовка. Хочу отметить еще один важный момент, ничто не мешает, одновременно с набором параметров в Entity-Body, помещать параметры с другими именами в Request-URI, например:

3.2 Content-Type: multipart/form-data

Как только интернет мир понял, что неплохо бы было через формы отсылать еще и файлы, так W3C консорциум взялся за доработку формата POST запроса. К тому времени уже достаточно широко применялся формат MIME (Multipurpose Internet Mail Extensions — многоцелевые расширения протокола для формирования Mail сообщений), поэтому, чтобы не изобретать велосипед заново, решили использовать часть данного формата формирования сообщений для создания POST запросов в протоколе HTTP.

Каковы же основные отличия этого формата от типа application/x-www-form-urlencoded?


Главное отличие в том, что Entity-Body теперь можно поделить на разделы, которые разделяются границами (boundary). Что самое интересное — каждый раздел может иметь свой собственный заголовок для описания данных, которые в нем хранятся, т.е. в одном запросе можно передавать данные различных типов (как в Mail письме Вы одновременно с текстом можете передавать файлы).

Итак, приступим. Рассмотрим опять все тот же пример с передачей логина и пароля, но теперь в новом формате.

Теперь давайте разбираться в том что написано. �� Я специально выделил некоторые символы rn жирным, чтобы они не сливались с данными. Присмотревшись внимательно можно заметить поле boundary после Content-Type. Это поле задает разделитель разделов — границу. В качестве границы может быть использована строка, состоящая из латинских букв и цифр, а так же из еще некоторых символов (к сожалению, не помню каких еще). В теле запроса в начало границы добавляется ‘—‘, а заканчивается запрос — границей, к которой символы ‘—‘ добавляются еще и в конец. В нашем запросе два раздела, первый описывает поле login, а второй поле password. Content-Disposition (тип данных в разделе) говорит, что это будут данные из формы, а в поле name задается имя поля. На этом заголовок раздела заканчивается и далее следует область данных раздела, в котором помещается значение поля (кодировать значение не требуется!).

Хочу обратить Ваше внимание та то, что в заголовках разделов не надо использовать Content-Length, а вот в заголовке запроса надо и его значение является размером всего Entity-Body, стоящего после второго rn, следующего за Content-Length: 209rn. Т.е. Entity-Body отделяется от заголовка дополнительным переводом строки (что можно заметить и в разделах).

А теперь давайте напишем запрос для передачи файла.

В данном примере в первом разделе пересылается заголовок новости, а во втором разделе пересылается файл news.txt. Внимательный да увидит поля filename и Content-Type во втором разделе. Поле filename задает имя пересылаемого файла, а поле Content-Type — тип данного файла. Application/octet-stream говорит о том, что это стандартный поток данных, а Content-Transfer-Encoding: binary говорит на о том, что это бинарные данные, ничем не закодированные.

Очень важный момент. Большинство CGI скриптов написано умными людьми, поэтому они любят проверять тип пришедшего файла, который стоит в Content-Type. Зачем? Чаще всего закачка файлов на сайтах используется для получения картинок от посетителя. Так вот, браузер сам пытается определить что за файл посетитель хочет отправить и вставляет соответствующий Content-Type в запрос. Скрипт его проверяет при получении, и, например, если это не gif или не jpeg игнорирует данный файл. Поэтому при «ручном» формировании запроса позаботьтесь о значении Content-Type, чтобы оно было наиболее близким к формату передаваемого файла.

image/gif для gif
image/jpeg для jpeg
image/png для png
image/tiff для tiff (что используется крайне редко, уж больно емкий формат)

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

Думаю, что о передаче запросов на сервер не стоит рассказывать подробно. Это уже дело чисто РНР техники :-). Достаточно внимательно прочитать раздел о функциях работы с сокетами, или о функциях модуля CURL в официальной документации РНР.

Из выше сказанного, надеюсь теперь понятно, почему вопрос: «Как мне сформировать POST запрос, используя функцию header?» — бессмысленен. Функция header(string) добавляет запись только в заголовок запроса, но никак не в тело запроса.

Новые книги

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

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

Книга подойдет руководителям и собственникам бизнеса, менеджерам отделов продаж, маркетинга, рекламы и PR – всем, кому по долгу службы необходимо уметь принимать правильные решения; обязательна к прочтению всем, кто хочет добиться осознанности своих решений и повысить собственную эффективность.

Функции HTTP

XXXVII. Функции HTTP

Эти функции позволяют манипулировать выводом, отправляемым обратно удалённому браузеру по протоколу HTTP.

Эти функции всегда доступны как часть стандартного модуля.

Нет специальных требований по установке этих функций, так как они являются частью ядра РНР.

Это расширение не определяет никаких директив конфигурации.

Это расширение не определяет никакие типы ресурсов.

Это расширение не определяет никаких констант.

АйТи бубен

Инструменты пользователя

Инструменты сайта

Содержание

HTTP (HyperText Transfer Protocol — «протокол передачи гипертекста») — протокол прикладного уровня передачи данных (изначально — в виде гипертекстовых документов). Основой HTTP является технология «клиент-сервер», то есть предполагается существование потребителей (клиентов), которые инициируют соединение и посылают запрос, и поставщиков (серверов), которые ожидают соединения для получения запроса, производят необходимые действия и возвращают обратно сообщение с результатом.

HTTP используется также в качестве «транспорта» для других протоколов прикладного уровня, таких как SOAP, XML-RPC, WebDAV.

Основным объектом манипуляции в HTTP является ресурс, на который указывает URI (Uniform Resource Identifier) в запросе клиента. Обычно такими ресурсами являются хранящиеся на сервере файлы, но ими могут быть логические объекты или что-то абстрактное. Особенностью протокола HTTP является возможность указать в запросе и ответе способ представления одного и того же ресурса по различным параметрам: формату, кодировке, языку и т. д. Именно благодаря возможности указания способа кодирования сообщения клиент и сервер могут обмениваться двоичными данными, хотя данный протокол является текстовым.

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

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

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

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

Каждый сервер обязан поддерживать как минимум методы GET и HEAD. Если сервер не распознал указанный клиентом метод, то он должен вернуть статус 501 (Not Implemented). Если серверу метод известен, но он не применим к конкретному ресурсу, то возвращается сообщение с кодом 405 (Method Not Allowed). В обоих случаях серверу следует включить в сообщение ответа заголовок Allow со списком поддерживаемых методов.

Кроме методов GET и HEAD, часто применяется метод POST.

Заголовки (параметры) HTTP запроса, ответа, сущности

Все заголовки в протоколе HTTP разделяются на четыре основных группы (в нижеприведенном порядке рекомендуется посылать заголовки получателю):

Все необходимые для функционирования HTTP заголовки описаны в основных RFC. При необходимости можно создавать свои заголовки. Традиционно к именам таких дополнительных заголовков добавляют префикс «X-» для избежания конфликта имён с возможно существующими.

Строки после главной строки запроса (GET /index.html HTTP/1.1) имеют следующий формат: Параметр: значение. Таким образом задаются параметры запроса. Это является необязательным, все строки после главной строки запроса могут отсутствовать; в этом случае сервер принимает их значение по умолчанию или по результатам предыдущего запроса (при работе в режиме Connection: Keep-Alive).

Формат ответа также имеет заголовок и тело, разделенное пустой строкой.

В чем разница между HTTP/1.1 и HTTP/2?

Hypertext Transfer Protocol, или HTTP – это протокол прикладного уровня, который с момента изобретения (в 1989 году) является стандартом для связи во Всемирной паутине. С момента выпуска HTTP/1.1 в 1997 году и до недавнего времени в протокол было внесено не так уж много изменений. Но в 2015 году появилась новая версия HTTP/2, в которой предлагается несколько способов снижения задержки, особенно при работе с мобильными платформами, а также с графикой и видео, интенсивно использующими сервер. С тех пор протокол HTTP/2 становится все более популярным: по некоторым оценкам, его поддерживают около трети всех веб-сайтов в мире. В этом переменчивом ландшафте веб-разработчики должны понимать технические различия между HTTP/1.1 и HTTP/2 и использовать их преимущества. Это позволяет принимать обоснованные и эффективные решения.

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

Краткий обзор протоколов HTTP/1.1 и HTTP/2

Чтобы лучше понимать контекст конкретных изменений, которые HTTP/2 внес в HTTP/1.1, давайте ознакомимся с историей разработки и основными принципами работы каждого из релизов протокола.

HTTP/1.1


Разработанный Тимоти Бернерсом-Ли (Timothy Berners-Lee) в 1989 году в качестве стандарта связи для Всемирной паутины, HTTP – это протокол верхнего (прикладного) уровня, который обеспечивает обмен информацией между клиентским компьютером и локальным или удаленным веб-сервером. В этом процессе клиент отправляет текстовый запрос на сервер, вызывая метод (GET или POST). В ответ сервер отправляет клиенту ресурс, например, HTML-страницу.

Предположим, вы посещаете веб-сайт по домену www.example.com. При переходе по этому URL-адресу веб-браузер на вашем компьютере отправляет HTTP-запрос в виде текстового сообщения:

GET /index.html HTTP/1.1
Host: www.example.com

Этот запрос использует метод GET, который запрашивает данные с хост-сервера, указанного после Host:. В ответ на этот запрос веб-сервер example.com возвращает клиенту HTML-страницу вместе с изображениями, таблицами стилей или другими ресурсами, запрашиваемыми в HTML. Обратите внимание, что при первом обращении к данным клиенту возвращаются не все ресурсы. Запросы и ответы будут передаваться между сервером и клиентом до тех пор, пока веб-браузер не получит все ресурсы, необходимые для отображения содержимого HTML-страницы на вашем экране.

Этот обмен запросами и ответами можно объединить в единый прикладной уровень интернет-протоколов, расположенный над транспортным уровнем (обычно по протоколу TCP) и сетевым уровнем (по протоколу IP).

Учебник РНР
НазадВперёд

Хост (браузер) Цель (веб-сервер)
Прикладной уровень (HTTP) Прикладной уровень (HTTP)
Транспортный уровень (TCP) Транспортный уровень (TCP)
Сетевой уровень (IP) Сетевой уровень (IP)
Канальный уровень Канальный уровень
————→ Интернет ————→

Можно еще долго обсуждать более низкие уровни этого стека, но чтобы получить общее представление о HTTP/2, достаточно знать только эту модель абстрактного и то, где в ней находится HTTP.

HTTP/2

HTTP/2 появился как протокол SPDY, разработанный в основном в Google с целью снижения задержки загрузки веб-страниц такими методами, как сжатие, мультиплексирование и приоритизация. Этот протокол послужил шаблоном для HTTP/2, когда группа httpbis (это рабочая группа Hypertext Transfer Protocol) из IETF (Internet Engineering Task Force) объединила стандарт. Так в мае 2015 года случился релиз HTTP/2. С самого начала многие браузеры (включая Chrome, Opera, Internet Explorer и Safari) поддерживали эту попытку стандартизации. Частично благодаря этой поддержке с 2015 года наблюдается высокий уровень внедрения протокола, особенно среди новых сайтов.

С технической точки зрения, одной из наиболее важных особенностей, которые отличают HTTP/1.1 и HTTP/2, является двоичный уровень кадрирования, который можно рассматривать как часть прикладного уровня в стеке интернет-протоколов. В отличие от HTTP/1.1, в котором все запросы и ответы хранятся в простом текстовом формате, HTTP/2 использует двоичный уровень кадрирования для инкапсуляции всех сообщений в двоичном формате, при этом сохраняя семантику HTTP (методы, заголовки). API прикладного уровня по-прежнему создает сообщения в обычных форматах HTTP, но нижележащий уровень преобразовывает эти сообщения в двоичные. Благодаря этому веб-приложения, созданные до HTTP/2, могут продолжать работать как обычно при взаимодействии с новым протоколом.

Преобразование сообщений в двоичные позволяет HTTP/2 применять новые подходы к доставке данных, недоступные в HTTP/1.1.

В следующем разделе мы рассмотрим модель доставки HTTP/1.1, а также расскажем, какие новые модели стали возможны благодаря HTTP/2.

Модели доставки

Как упоминалось в предыдущем разделе, HTTP/1.1 и HTTP/2 используют одну и ту же семантику, благодаря чему запросы и ответы, передаваемые между сервером и клиентом в обоих протоколах, достигают цели в виде традиционно отформатированных сообщений с заголовками и телом, используя знакомые методы (GET и POST). Но если HTTP/1.1 передает их в виде текстовых сообщений, то HTTP/2 кодирует их в двоичный файл, что позволяет ему применять другие модели доставки. В этом разделе мы сначала кратко рассмотрим, как HTTP/1.1 пытается оптимизировать эффективность с помощью своей модели доставки и какие при этом возникают проблемы, а затем ознакомимся с преимуществами двоичного уровня кадрирования HTTP/2 и его методами приоритизации запросов.

HTTP/1.1: конвейерная обработка и блокировка очереди

Первый ответ, который клиент получает на запрос GET, часто содержит не всю страницу, а ссылки на дополнительные ресурсы, необходимые для запрашиваемой страницы. Только после загрузки страницы клиент обнаруживает, что для полной визуализации от сервера требуются эти дополнительные ресурсы. Потому клиенту приходится делать дополнительные запросы для извлечения этих ресурсов. В HTTP/1.0 клиент должен был разрывать и снова создавать TCP-соединение для каждого нового запроса, а это довольно затратно с точки зрения времени и ресурсов.

HTTP/1.1 устраняет эту проблему через постоянные соединения и конвейерную обработку (pipelining). HTTP/1.1 предполагает, что TCP-соединение должно оставаться открытым, если закрытие не указано прямо. Это позволяет клиенту отправлять несколько запросов по одному и тому же соединению, не дожидаясь ответа на каждый запрос, что значительно повышает производительность по сравнению с HTTP/1.0.

К сожалению, в этой стратегии оптимизации есть узкое место. Поскольку при отправке в один и тот же пункт назначения несколько пакетов данных не могут проходить друг через друга, возникают ситуации, когда запрос в начале очереди, который не может извлечь требуемый ресурс, блокирует все запросы, находящиеся за ним. Это называется блокировкой очереди (head-of-line blocking, или HOL) и представляет собой серьезную проблему оптимизации эффективности соединения в HTTP/1.1. Добавление отдельных параллельных TCP-соединений может решить эту проблему, но в протоколе существуют ограничения на количество одновременных TCP-соединений между клиентом и сервером, и каждое новое соединение требует значительных ресурсов.

Эти проблемы были в центре внимания разработчиков HTTP/2, которые предложили использовать вышеупомянутый двоичный уровень кадрирования – мы поговорим об этом в следующем разделе.

HTTP/2: преимущества двоичного уровня кадрирования

В HTTP/2 двоичный уровень кадрирования кодирует запросы и ответы и разбивает их на более мелкие пакеты информации, что значительно повышает гибкость передачи данных.

Давайте подробнее рассмотрим, как это работает. В отличие от HTTP/1.1, который должен использовать несколько соединений TCP для снижения блокировки HOL, HTTP/2 устанавливает один объект соединения между двумя компьютерами. В этой связи есть несколько потоков данных. Каждый поток состоит из нескольких сообщений в привычном формате запрос-ответ. Наконец, каждое из этих сообщений разбивается на более мелкие блоки, называемые кадрами.

Поток 1 Поток N
Сообщение 1 Сообщение 2 Сообщение N Сообщение 1 Сообщение 2 Сообщение N
кадр кадр кадр кадр кадр кадр кадр кадр кадр кадр кадр кадр кадр кадр кадр кадр кадр кадр

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

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

Единое соединение TCP также повышает производительность протокола HTTPS, поскольку клиент и сервер могут повторно использовать один и тот же защищенный сеанс для нескольких запросов/ответов. В HTTPS во время рукопожатия TLS или SSL обе стороны договариваются об использовании одного ключа в течение сеанса. Если соединение прерывается, начинается новый сеанс, для которого требуется новый сгенерированный ключ. Таким образом, поддержание одного соединения может значительно уменьшить ресурсы, необходимые для работы HTTPS. Обратите внимание: хотя спецификации HTTP/2 не требуют использовать уровень TLS, многие основные браузеры поддерживают только HTTP/2 с HTTPS.

Хотя мультиплексирование, свойственное двоичному уровню кадрирования, устраняет некоторые проблемы HTTP/1.1, проблемы с производительностью могут возникнуть из-за нескольких потоков, ожидающих одного и того же ресурса. Конструкция HTTP/2 учитывает и это, используя приоритезацию потоков.

HTTP/2: приоритезация потоков

Приоритизация потоков не только предотвращает потенциальную проблему с запросами, конкурирующими за один и тот же ресурс, но также позволяет разработчикам настраивать относительный вес запросов для лучшей оптимизации производительности приложений. В этом разделе мы разберем этот процесс, чтобы лучше понять, как можно использовать эту функцию HTTP/2.

Как вы теперь знаете, двоичный уровень кадрирования организует сообщения в параллельные потоки данных. Когда клиент отправляет параллельные запросы на сервер, он может расставить приоритеты запрашиваемых им ответов, присваивая вес от 1 до 256 каждому потоку. Чем выше вес, тем выше приоритет. Кроме того, клиент также определяет зависимости между потоками (указывая ID потока, от которого будет зависеть тот или иной поток). Если родительский идентификатор опущен, считается, что поток зависит от корневого потока.

Канал
Stream > Stream > Stream > Stream > Stream > Stream >
Parent > P > P > P > P > P >
Вес=4 Вес=6 Вес=2 Вес=4 Вес=6 Вес=6

На этой иллюстрации канал содержит шесть потоков, каждый из которых имеет уникальный идентификатор и связан с определенным весом. Поток 1 не имеет родительского ID, связанного с ним, и по умолчанию связан с корневым узлом. Все остальные потоки помечены родительским ID. Распределение ресурсов для каждого потока будет основываться на их весе и зависимостях, которые им требуются. Например, потоки 5 и 6, которым на рисунке назначен одинаковый вес и один и тот же родительский поток, при распределении ресурсов будут иметь одинаковую приоритетность.

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

S >

*
S >
Вес=4
S >
Вес=6
S >
Вес=2
S >
Вес=4
→ →
S >
Вес=6
S >
Вес=6

В этом дереве зависимостей поток 1 зависит от корневого потока. Поскольку это единственный поток, порождаемый корневым потоком, все доступные ресурсы будут выделяться потоку 1 раньше других. Поскольку дерево указывает, что поток 2 зависит от завершения потока 1, поток 2 не будет обрабатываться, пока не будет завершена задача потока 1. Теперь давайте рассмотрим потоки 3 и 4. Оба они зависят от потока 2. Как и в случае с потоком 1, поток 2 получит все доступные ресурсы раньше, чем 3 и 4. После того, как поток 2 завершит свою задачу, потоки 3 и 4 получат ресурсы; они делятся в соотношении 2: 4, в соответствии с их весом, что передает большую часть ресурсов потоку 4. Наконец, когда поток 3 будет обработан, доступные ресурсы в равных частях получат потоки 5 и 6. Это может произойти до выполнения потока 4, даже если поток 4 получает большую часть ресурсов. Потоки более низкого уровня могут запускаться, как только завершатся потоки верхнего уровня, от которых они зависят.

Как разработчик приложения, вы можете устанавливать вес ваших запросов в зависимости от потребностей. Например, вы можете установить более низкий приоритет для загрузки изображения с высоким разрешением, предоставив миниатюру изображения на веб-странице. Давая возможность назначать вес, HTTP/2 позволяет разработчикам лучше контролировать рендеринг веб-страниц. Протокол также позволяет клиенту изменять зависимости и перераспределять вес во время выполнения в ответ на взаимодействие с пользователем. Однако важно отметить, что сервер может изменить назначенные приоритеты самостоятельно, если определенный поток заблокирован от доступа к конкретному ресурсу.

Переполнение буфера

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

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

Чтобы избежать переполнения буфера, механизм управления потоком не должен позволять отправителю перегружать получателя данными. В этом разделе мы рассмотрим, как HTTP/1.1 и HTTP/2 используют разные версии этого механизма для управления потоком данных в соответствии с различными моделями доставки.

HTTP/1.1

В HTTP / 1.1 управление потоком основывается на базовом TCP-соединении. Когда это соединение инициируется, клиент и сервер устанавливают размеры буфера, используя системные настройки по умолчанию. Если буфер получателя частично заполнен данными, он сообщит отправителю свое окно приема, то есть количество доступного пространства, которое остается в буфере. Это окно приема объявляется в сигнале, известном как пакет ACK (это пакет данных, который отправляет приемник, чтобы подтвердить, что он принял сигнал открытия). Если этот объявленный размер окна приема равен нулю, отправитель не будет отправлять данные, пока клиент не очистит свой буфер и затем не запросит возобновить передачу данных. Здесь важно отметить, что использование окон приема, основанных на базовом TCP-соединении, может реализовать управление потоком на одном из концов соединения.

Поскольку HTTP/1.1 использует транспортный уровень, чтобы избежать переполнения буфера, каждое новое TCP-соединение требует отдельного механизма управления потоком. А HTTP/2 мультиплексирует потоки в одном TCP-соединении и должен реализовать управление потоками другим способом.

HTTP/2

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

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

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

С точки зрения управления потоком и приоритизации, упомянутых в предыдущем разделе, HTTP/2 обеспечивает более тонкий контроль, что открывает возможность большей оптимизации.


Прогнозирование запросов ресурсов

В типичном веб-приложении клиент отправляет GET-запрос и получает страницу в формате HTML. Обычно это индексная страница сайта. Исследуя содержимое страницы, клиент может обнаружить, что для полной визуализации страницы ему необходимо извлечь дополнительные ресурсы, такие как файлы CSS и JavaScript. Клиент определяет, что эти дополнительные ресурсы ему нужны, только после получения ответа от исходного GET-запроса. Таким образом, он должен сделать дополнительные запросы для извлечения этих ресурсов и завершения соединения страницы. Эти дополнительные запросы в конечном итоге увеличивают время загрузки.

Однако эту проблему можно решить: поскольку сервер заранее знает, что клиенту потребуются дополнительные файлы, сервер может сэкономить время клиента, отправляя клиенту эти ресурсы прежде, чем он их запросит. HTTP/1.1 и HTTP/2 имеют разные стратегии для достижения этой цели, каждая из которых описана в этом разделе.

HTTP/1.1: встраивание ресурсов

В HTTP/1.1, если разработчик заранее знает, какие дополнительные ресурсы потребуется клиентскому компьютеру для отображения страницы, он может использовать метод встраивания ресурсов для включения требуемого ресурса непосредственно в документ HTML, который сервер отправляет в ответ на исходный запрос GET. Например, если клиенту нужен определенный файл CSS для визуализации страницы, встраивание этого файла предоставит клиенту необходимый ресурс, прежде чем он его запросит. Это уменьшает общее количество запросов, которые клиент должен отправить на сервер.

Но со встраиванием ресурсов есть несколько проблем. Встраивание в документ HTML – целесообразное решение для небольших текстовых ресурсов, но большие файлы в нетекстовых форматах могут значительно увеличить размер HTML документа, что в конечном итоге может снизить скорость соединения и вообще свести на нет исходное преимущество этой техники. Кроме того, поскольку встроенные ресурсы больше не отделены от HTML-документа, у клиента нет механизма для сокращения ресурсов или для размещения ресурса в кэше. Если ресурсу требуется несколько страниц, каждый новый HTML-документ будет содержать в своем коде один и тот же ресурс, что приведет к увеличению размера HTML-документов и времени загрузки (обработка займет больше времени, чем если бы ресурс просто кэшировался в начале).

Таким образом, основным недостатком встраивания является то, что клиент не может разделить ресурс и документ. Для оптимизации соединения необходим более высокий уровень контроля, который HTTP/2 стремится предоставить с помощью Server Push.

HTTP/2: механизм Server Push

Поскольку HTTP/2 поддерживает множество одновременных ответов на первоначальный GET запрос клиента, сервер может отправить клиенту ресурс вместе с запрошенной HTML-страницей, предоставляя ресурс до того, как клиент запросит его. Этот процесс называется Server Push. Таким образом, HTTP/2-соединение может выполнить ту же задачу по встраиванию ресурсов, при этом сохраняя разделение между помещаемым ресурсом и документом. Это означает, что клиент может решить кэшировать или отклонить отправленный ресурс отдельно от основного HTML-документа. Так HTTP/2 устраняет основной недостаток встраивания ресурсов.

В HTTP/2 этот процесс начинается, когда сервер отправляет кадр PUSH_PROMISE, чтобы сообщить клиенту, что он собирается отправить ресурс. Этот кадр включает в себя только заголовок сообщения и позволяет клиенту заранее узнать, какой ресурс отправит сервер. Если ресурс уже кэширован, клиент может отклонить отправку, отправив в ответ кадр RST_STREAM. Кадр PUSH_PROMISE также предотвращает отправку дублированного запроса на сервер (поскольку клиент знает, какие ресурсы сервер собирается отправить).

Здесь важно отметить, что Server Push делает акцент на контроль клиента. Если клиенту необходимо отрегулировать приоритет Server Push или даже отключить его, он может в любое время отправить кадр SETTINGS для изменения этой функции HTTP/2.

Несмотря на то, что функция Server Push имеет большой потенциал, она не всегда оптимизирует работу веб-приложения. Например, некоторые веб-браузеры не всегда могут отменить отправленные запросы, даже если клиент уже кэшировал ресурс. Если клиент по ошибке разрешает серверу отправлять дублирующийся ресурс, Server Push может израсходовать соединение. В конце концов, принудительный Server Push должен использоваться по усмотрению разработчика. Больше о том, как использовать Server Push стратегически и оптимизировать веб-приложения, можно узнать из шаблона PRPL, разработанного Google. Чтобы узнать больше о возможных проблемах, связанных с принудительным Server Push, читайте этот пост.

Сжатие

Распространенным методом оптимизации веб-приложений является использование алгоритмов сжатия для уменьшения размера HTTP-сообщений, которые передаются между клиентом и сервером. HTTP/1.1 и HTTP/2 используют эту стратегию, но в первом протоколе существуют проблемы с реализацией, которые запрещают сжатие всего сообщения. В следующем разделе мы обсудим, почему это происходит и как HTTP/2 может решить эту проблему.

HTTP/1.1

Такие программы, как gzip, давно используются для сжатия данных, отправляемых в сообщениях HTTP, особенно для уменьшения размера файлов CSS и JavaScript. Однако компонент заголовка сообщения всегда отправляется в виде простого текста. Несмотря на то, что каждый заголовок довольно мал, объем этих несжатых данных увеличивает нагрузку на соединение по мере того как клиент отправляет больше запросов. Особенно это касается сложных веб-приложений с тяжелым API, которые требуют много разных ресурсов и, следовательно, много разных запросов. Кроме того, использование файлов cookie иногда может значительно увеличить заголовки, что, в свою очередь, увеличивает потребность в сжатии.

Чтобы устранить это узкое место, HTTP/2 использует сжатие HPACK, которое позволяет уменьшить размер заголовков.

HTTP/2

Одна из функций, которая постоянно всплывает при обсуждении HTTP/2 – это двоичный уровень кадрирования, который предоставляет больший контроль над мелкими деталями. Это касается и сжатия заголовков. HTTP/2 может отделить заголовки от остальных данных, в результате чего получаются кадр заголовка и кадр данных. Программа сжатия HPACK (специальная для HTTP/2) может затем сжать этот кадр заголовка. Этот алгоритм может кодировать метаданные заголовка с помощью кодирования Хаффмана, тем самым значительно уменьшая его размер. Кроме того, HPACK может отслеживать ранее переданные поля метаданных и дополнительно сжимать их в соответствии с динамически измененным индексом между клиентом и сервером. Например, рассмотрим следующие два запроса:

#запрос 1
method: GET
scheme: https
host: example.com
path: /academy
accept: /image/jpeg
user-agent: Mozilla/5.0 .

#запрос 2
method: GET
scheme: https
host: example.com
path: /academy/images
accept: /image/jpeg
user-agent: Mozilla/5.0 .

Поля в этих запросах (method, scheme, host, accept и user-agent) имеют одинаковые значения; только поле path использует другое значение. В результате при отправке запроса 2 клиент может использовать HPACK для отправки индексированных значений, необходимых для восстановления общих полей и нового кодирования поля path. Кадры заголовка будут выглядеть следующим образом:

#запрос 1
method: GET
scheme: https
host: example.com
path: /academy
accept: /image/jpeg
user-agent: Mozilla/5.0 .

#запрос 2
path: /academy/images

Используя HPACK и другие методы сжатия, HTTP/2 предоставляет еще одну функцию, которая позволяет уменьшить задержку между клиентом и сервером.

Заключение

Поэтапный анализ, проведенный в данной статье, показывает отличия между HTTP/2 и HTTP/1.1. Некоторые функции HTTP/2 обеспечивают более высокий уровень контроля, который можно использовать для оптимизации производительности веб-приложений, а другие функции просто улучшают предыдущий протокол. Теперь, когда вы получили общее представление о различиях между двумя протоколами, вы можете подумать о том, как мультиплексирование, приоритизация потока, Server Push и сжатие могут повлиять на меняющийся ландшафт веб-разработки.

Если вы хотите сравнить производительность HTTP/1.1 и HTTP/2, ознакомьтесь с этой демонстрацией Google. Обратите внимание, что при запуске теста на компьютере время загрузки страницы может варьироваться в зависимости от нескольких факторов, таких как пропускная способность, клиентские и серверные ресурсы, доступные на момент тестирования, и так далее. Если вы хотите изучить результаты более исчерпывающего тестирования, взгляните на эту статью.

Протокол HTTP¶

HTTP (HyperText Transfer Protocol — протокол передачи гипертекста) — символьно-ориентированный клиент-серверный протокол прикладного уровня без сохранения состояния, используемый сервисом World Wide Web.

Основным объектом манипуляции в HTTP является ресурс, на который указывает URI (Uniform Resource Identifier – уникальный идентификатор ресурса) в запросе клиента. Основными ресурсами являются хранящиеся на сервере файлы, но ими могут быть и другие логические (напр. каталог на сервере) или абстрактные объекты (напр. ISBN). Протокол HTTP позволяет указать способ представления (кодирования) одного и того же ресурса по различным параметрам: mime-типу, языку и т. д. Благодаря этой возможности клиент и веб-сервер могут обмениваться двоичными данными, хотя данный протокол является текстовым.

Структура протокола¶

Структура протокола определяет, что каждое HTTP-сообщение состоит из трёх частей (рис. 1), которые передаются в следующем порядке:

  1. Стартовая строка (англ. Starting line) — определяет тип сообщения;
  2. Заголовки (англ. Headers) — характеризуют тело сообщения, параметры передачи и прочие сведения;
  3. Тело сообщения (англ. Message Body) — непосредственно данные сообщения. Обязательно должно отделяться от заголовков пустой строкой.

Рис. 1. Структура протокола HTTP (дамп пакета, полученный сниффером Wireshark)

Стартовая строка HTTP¶

Cтартовая строка является обязательным элементом, так как указывает на тип запроса/ответа, заголовки и тело сообщения могут отсутствовать.

Стартовые строки различаются для запроса и ответа. Строка запроса выглядит так:

Стартовая строка ответа сервера имеет следующий формат:

Например, на предыдущий наш запрос клиентом данной страницы сервер ответил строкой:

Методы протокола¶

Метод HTTP (англ. HTTP Method) — последовательность из любых символов, кроме управляющих и разделителей, указывающая на основную операцию над ресурсом. Обычно метод представляет собой короткое английское слово, записанное заглавными буквами (Табл. 1). Названия метода чувствительны к регистру.

Таблица 1. Методы протокола HTTP

Используется для определения возможностей веб-сервера или параметров соединения для конкретного ресурса. Предполагается, что запрос клиента может содержать тело сообщения для указания интересующих его сведений. Формат тела и порядок работы с ним в настоящий момент не определён. Сервер пока должен его игнорировать. Аналогичная ситуация и с телом в ответе сервера.

Для того чтобы узнать возможности всего сервера, клиент должен указать в URI звёздочку — «*». Запросы «OPTIONS * HTTP/1.1» могут также применяться для проверки работоспособности сервера (аналогично «пингованию») и тестирования на предмет поддержки сервером протокола HTTP версии 1.1.

Результат выполнения этого метода не кэшируется.


Используется для запроса содержимого указанного ресурса. С помощью метода GET можно также начать какой-либо процесс. В этом случае в тело ответного сообщения следует включить информацию о ходе выполнения процесса. Клиент может передавать параметры выполнения запроса в URI целевого ресурса после символа «?»: GET /path/resource?param1=value1¶m2=value2 HTTP/1.1

Согласно стандарту HTTP, запросы типа GET считаются идемпотентными[4] — многократное повторение одного и того же запроса GET должно приводить к одинаковым результатам (при условии, что сам ресурс не изменился за время между запросами). Это позволяет кэшировать ответы на запросы GET.

Кроме обычного метода GET, различают ещё условный GET и частичный GET. Условные запросы GET содержат заголовки If-Modified-Since, If-Match, If-Range и подобные. Частичные GET содержат в запросе Range. Порядок выполнения подобных запросов определён стандартами отдельно.

Аналогичен методу GET, за исключением того, что в ответе сервера отсутствует тело. Запрос HEAD обычно применяется для извлечения метаданных, проверки наличия ресурса (валидация URL) и чтобы узнать, не изменился ли он с момента последнего обращения.

Заголовки ответа могут кэшироваться. При несовпадении метаданных ресурса с соответствующей информацией в кэше копия ресурса помечается как устаревшая.

Применяется для передачи пользовательских данных заданному ресурсу. Например, в блогах посетители обычно могут вводить свои комментарии к записям в HTML-форму, после чего они передаются серверу методом POST и он помещает их на страницу. При этом передаваемые данные (в примере с блогами — текст комментария) включаются в тело запроса. Аналогично с помощью метода POST обычно загружаются файлы.

В отличие от метода GET, метод POST не считается идемпотентным[4], то есть многократное повторение одних и тех же запросов POST может возвращать разные результаты (например, после каждой отправки комментария будет появляться одна копия этого комментария).

При результатах выполнения 200 (Ok) и 204 (No Content) в тело ответа следует включить сообщение об итоге выполнения запроса. Если был создан ресурс, то серверу следует вернуть ответ 201 (Created) с указанием URI нового ресурса в заголовке Location.

Сообщение ответа сервера на выполнение метода POST не кэшируется.

Применяется для загрузки содержимого запроса на указанный в запросе URI. Если по заданному URI не существовало ресурса, то сервер создаёт его и возвращает статус 201 (Created). Если же был изменён ресурс, то сервер возвращает 200 (Ok) или 204 (No Content). Сервер не должен игнорировать некорректные заголовки Content-* передаваемые клиентом вместе с сообщением. Если какой-то из этих заголовков не может быть распознан или не допустим при текущих условиях, то необходимо вернуть код ошибки 501 (Not Implemented).

Фундаментальное различие методов POST и PUT заключается в понимании предназначений URI ресурсов. Метод POST предполагает, что по указанному URI будет производиться обработка передаваемого клиентом содержимого. Используя PUT, клиент предполагает, что загружаемое содержимое соответствуют находящемуся по данному URI ресурсу.

Сообщения ответов сервера на метод PUT не кэшируются.

Аналогично PUT, но применяется только к фрагменту ресурса.

Удаляет указанный ресурс.

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

Устанавливает связь указанного ресурса с другими.

Убирает связь указанного ресурса с другими.

Каждый сервер обязан поддерживать как минимум методы GET и HEAD. Если сервер не распознал указанный клиентом метод, то он должен вернуть статус 501 (Not Implemented). Если серверу метод известен, но он не применим к конкретному ресурсу, то возвращается сообщение с кодом 405 (Method Not Allowed). В обоих случаях серверу следует включить в сообщение ответа заголовок Allow со списком поддерживаемых методов.

Наиболее востребованными являются методы GET и POST — на человеко-ориентированных ресурсах, POST — роботами поисковых машин и оффлайн-браузерами.

Прокси-сервер

Прокси — это транзитный сервер, перенаправляющий HTTP-трафик. Прокси-серверы используются для ускорения выполнения запросов путем кэширования веб-страниц. В локальной сети применяется как межсетевой экран и средство управления HTTP-трафиком (например, для блокирования доступа к некоторым ресурсам). В Интернете прокси часто используют для анонимизации запросов — в этом случае веб-сервер получает ip-адрес прокси-сервера, а не реального клиента. В современных браузерах можно задать целый список прокси и переключаться между серверами из этого списка по мере необходимости (обычно такая возможность доступна через расширения или плагины браузера).

Коды состояния¶

Код состояния информирует клиента о результатах выполнения запроса и определяет его дальнейшее поведение. Набор кодов состояния является стандартом, и все они описаны в соответствующих документах RFC.

Каждый код представляется целым трехзначным числом. Первая цифра указывает на класс состояния, последующие — порядковый номер состояния (рис 1.). За кодом ответа обычно следует краткое описание на английском языке.

Рис. 1. Структура кода состояния HTTP

Введение новых кодов должно производиться только после согласования с IETF. Клиент может не знать все коды состояния, но он обязан отреагировать в соответствии с классом кода.

Применяемые в настоящее время классы кодов состояния и некоторые примеры ответов сервера приведены в табл. 2.

Таблица 2. Коды состояния протокола HTTP

Метод Краткое описание
OPTIONS
GET
HEAD
POST
PUT
PATCH
DELETE
TRACE
LINK
UNLINK

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

Примеры ответов сервера:

Сообщения данного класса информируют о случаях успешного принятия и обработки запроса клиента. В зависимости от статуса сервер может ещё передать заголовки и тело сообщения.

Примеры ответов сервера:

Коды статуса класса 3xx сообщают клиенту, что для успешного выполнения операции нужно произвести следующий запрос к другому URI. В большинстве случаев новый адрес указывается в поле Location заголовка. Клиент в этом случае должен, как правило, произвести автоматический переход (жарг. «редирект»).

Обратите внимание, что при обращении к следующему ресурсу можно получить ответ из этого же класса кодов. Может получиться даже длинная цепочка из перенаправлений, которые, если будут производиться автоматически, создадут чрезмерную нагрузку на оборудование. Поэтому разработчики протокола HTTP настоятельно рекомендуют после второго подряд подобного ответа обязательно запрашивать подтверждение на перенаправление у пользователя (раньше рекомендовалось после 5-го). За этим следить обязан клиент, так как текущий сервер может перенаправить клиента на ресурс другого сервера. Клиент также должен предотвратить попадание в круговые перенаправления.

Примеры ответов сервера:

Класс кодов 4xx предназначен для указания ошибок со стороны клиента. При использовании всех методов, кроме HEAD, сервер должен вернуть в теле сообщения гипертекстовое пояснение для пользователя.

Примеры ответов сервера:


Коды 5xx выделены под случаи неудачного выполнения операции по вине сервера. Для всех ситуаций, кроме использования метода HEAD, сервер должен включать в тело сообщения объяснение, которое клиент отобразит пользователю.

Примеры ответов сервера:

Заголовки HTTP¶

Заголовок HTTP (HTTP Header) — это строка в HTTP-сообщении, содержащая разделённую двоеточием пару вида «параметр-значение». Формат заголовка соответствует общему формату заголовков текстовых сетевых сообщений ARPA (RFC 822). Как правило, браузер и веб-сервер включают в сообщения более чем по одному заголовку. Заголовки должны отправляться раньше тела сообщения и отделяться от него хотя бы одной пустой строкой (CRLF).

Название параметра должно состоять минимум из одного печатного символа (ASCII-коды от 33 до 126). После названия сразу должен следовать символ двоеточия. Значение может содержать любые символы ASCII, кроме перевода строки (CR, код 10) и возврата каретки (LF, код 13).

Пробельные символы в начале и конце значения обрезаются. Последовательность нескольких пробельных символов внутри значения может восприниматься как один пробел. Регистр символов в названии и значении не имеет значения (если иное не предусмотрено форматом поля).

Пример заголовков ответа сервера:

Все HTTP-заголовки разделяются на четыре основных группы:

  1. General Headers (Основные заголовки) — должны включаться в любое сообщение клиента и сервера.
  2. Request Headers (Заголовки запроса) — используются только в запросах клиента.
  3. Response Headers (Заголовки ответа) — присутствуют только в ответах сервера.
  4. Entity Headers (Заголовки сущности) — сопровождают каждую сущность сообщения.

Сущности (entity, в переводах также встречается название “объект”) — это полезная информация, передаваемая в запросе или ответе. Сущность состоит из метаинформации (заголовки) и непосредственно содержания (тело сообщения).

В отдельный класс заголовки сущности выделены, чтобы не путать их с заголовками запроса или заголовками ответа при передаче множественного содержимого (multipart/ * ). Заголовки запроса и ответа, как и основные заголовки, описывают всё сообщение в целом и размещаются только в начальном блоке заголовков, в то время как заголовки сущности характеризуют содержимое каждой части в отдельности, располагаясь непосредственно перед её телом.

В таблице 3 приведено краткое описание некоторых HTTP-заголовков.

Таблица 3. Заголовки HTTP

Класс кодов Краткое описание
1xx Informational (Информационный)
2xx Success (Успешно)
3xx Redirection (Перенаправление)
4xx Client Error (Ошибка клиента)
5xx Server Error (Ошибка сервера)
Заголовок Группа Краткое описание
Allow Entity Список методов, применимых к запрашиваемому ресурсу.
Content-Encoding Entity Применяется при необходимости перекодировки содержимого (например, gzip/deflated).
Content-Language Entity Локализация содержимого (язык(и))
Content-Length Entity Размер тела сообщения (в октетах)
Content-Range Entity Диапазон (используется для поддержания многопоточной загрузки или дозагрузки)
Content-Type Entity Указывает тип содержимого (mime-type, например text/html).Часто включает указание на таблицу символов локали (charset)
Expires Entity Дата/время, после которой ресурс считается устаревшим. Используется прокси-серверами
Last-Modified Entity Дата/время последней модификации сущности
Cache-Control General Определяет директивы управления механизмами кэширования. Для прокси-серверов.
Connection General Задает параметры, требуемые для конкретного соединения.
Date General Дата и время формирования сообщения
Pragma General Используется для специальных указаний, которые могут (опционально) применяется к любому получателю по всей цепочке запросов/ответов (например, pragma: no-cache).
Transfer-Encoding General Задает тип преобразования, применимого к телу сообщения. В отличие от Content-Encoding этот заголовок распространяется на все сообщение, а не только на сущность.
Via General Используется шлюзами и прокси для отображения промежуточных протоколов и узлов между клиентом и веб-сервером.
Warning General Дополнительная информация о текущем статусе, которая не может быть представлена в сообщении.
Accept Request Определяет применимые типы данных, ожидаемых в ответе.
Accept-Charset Request Определяет кодировку символов (charset) для данных, ожидаемых в ответе.
Accept-Encoding Request Определяет применимые форматы кодирования/декодирования содержимого (напр, gzip)
Accept-Language Request Применимые языки. Используется для согласования передачи.
Authorization Request Учетные данные клиента, запрашивающего ресурс.
From Request Электронный адрес отправителя
Host Request Имя/сетевой адрес [и порт] сервера. Если порт не указан, используется 80.
If-Modified-Since Request Используется для выполнения условных методов (Если-Изменился. ). Если запрашиваемый ресурс изменился, то он передается с сервера, иначе — из кэша.
Max-Forwards Request Представляет механиз ограничения количества шлюзов и прокси при использовании методов TRACE и OPTIONS.
Proxy-Authorization Request Используется при запросах, проходящих через прокси, требующие авторизации
Referer Request Адрес, с которого выполняется запрос. Этот заголовок отсутствует, если переход выполняется из адресной строки или, например, по ссылке из js-скрипта.
User-Agent Request Информация о пользовательском агенте (клиенте)
Location Response Адрес перенаправления
Proxy-Authenticate Response Сообщение о статусе с кодом 407.
Server Response Информация о программном обеспечении сервера, отвечающего на запрос (это может быть как веб- так и прокси-сервер).

В листинге 1 приведен фрагмент дампа заголовков при подключении к серверу http://example.org

Листинг 1. Заголовки HTTP

Несколько полезных примеров php-скриптов, обрабатывающих HTTP-заголовки, приведены в статье «Использование файла .htaccess» (редирект, отправка кода ошибки, установка last-modified и т.п.).

Тело сообщения¶

Тело HTTP сообщения (message-body), если оно присутствует, используется для передачи сущности, связанной с запросом или ответом. Тело сообщения (message-body) отличается от тела сущности (entity-body) только в том случае, когда при передаче применяется кодирование, указанное в заголовке Transfer-Encoding. В остальных случаях тело сообщения идентично телу сущности.

Заголовок Transfer-Encoding должен отправляться для указания любого кодирования передачи, примененного приложением в целях гарантирования безопасной и правильной передачи сообщения. Transfer-Encoding — это свойство сообщения, а не сущности, и оно может быть добавлено или удалено любым приложением в цепочке запросов/ответов.

Присутствие тела сообщения в запросе отмечается добавлением к заголовкам запроса поля заголовка Content-Length или Transfer-Encoding. Тело сообщения (message-body) может быть добавлено в запрос только когда метод запроса допускает тело объекта (entity-body).

Все ответы содержат тело сообщения, возможно нулевой длины, кроме ответов на запрос методом HEAD и ответов с кодами статуса 1xx (Информационные), 204 (Нет содержимого, No Content), и 304 (Не модифицирован, Not Modified).

Что такое HTTP

7 октября 2020 года. Опубликовано в разделах: Азбука терминов. 16135

Аббревиатура читается как «HyperText Transfer Protocol», что в переводе означает «протокол для передачи гипертекста». HTTP относится к группе прикладного уровня на основании специфики, использующейся OSI.

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

Для чего нужен HTTP

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

Таким образом, протокол HTTP позволяет осуществлять обмен информацией между различными приложениями пользователей и специальными веб-серверами, а также подключаться к веб-ресурсам (как правило, браузерам). Сегодня описываемый протокол обеспечивает работу всей сети. Протокол передачи данных HTTP применяется и для передачи информации по другим протоколам более низкого уровня, например, WebDAV или SOAP. При этом протокол представляет собой средство для транспортировки. Многие программы также основываются на применении HTTP в качестве основного инструмента для обмена информацией. Данные представляются в различных форматах, к примеру, JSON или XML.

HTTP является протоколом для обмена информацией с помощью соединения IP/ ТСР. Как правило, для этого сервер использует порт 80 типа TCP. Если порт не прописан, программное обеспечение клиента будет использовать порт 80 типа TCP по умолчанию. В некоторых случаях могут использоваться и другие порты.

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

Чем отличается HTTP от HTTPS

Отличие можно обнаружить даже из расшифровок аббревиатур. HTTPS расшифровывается как «защита протокола передачи гипертекста». Таким образом, HTTP — самостоятельный протокол, а HTTPS — расширение для его защиты. По HTTP информация передается незащищенной, а HTTPS обеспечивает криптографическую защиту. Особенно актуально это для ресурсов с ответственной авторизацией. Это могут быть социальные сети или сайты платежных систем.

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

Таким образом, HTTP применяется для передачи данных, а HTTPS позволяет осуществлять защищенную передачу данных с помощью шифрования и выполнять авторизацию на ресурсах с высоким уровнем безопасности.

Дополнительный функционал

HTTP отличается богатым функционалом, он совместим с различными расширениями. Используемая сегодня спецификация 1.1 позволяет применять заголовок Upgrade для переключения и работы через другие протоколы при обмене данными. Для этого пользователь должен отправить запрос серверу с данным заголовком. Если же сервер нуждается в переходе на специфичный обмен по иному протоколу, он возвращает клиенту запрос, в котором отображается статус «426 Upgrade Required».

Данная возможность особенно актуальна для обмена информацией через WebSocket (имеет спецификацию RFC 6455 , позволяет обмениваться данными в любой момент, без лишних HTTP-запросов). Для перехода на WebSocket один пользователь отправляет запрос с заголовком Upgrade и значением «websocket». Далее сервер отвечает «101 Switching Protocols». После этого момента начинается передача информация по WebSocket.

Специалисты студии SEMANTICA проведут комплексный анализ сайта по следующему плану:

– Технический аудит.
– Оптимизация.
– Коммерческие факторы.
– Внешние факторы.

Мы не просто говорим, в чем проблемы. Мы помогаем их решить

Функции протокола HTTP

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

Эти функции всегда доступны.

Для использования этих функций не требуется проведение установки, поскольку они являются частью ядра PHP.

Данное расширение не определяет никакие директивы конфигурации в php.ini .

Данное расширение не определяет никакие типы ресурсов.

Данное расширение не определяет никакие константы.

Илон Маск рекомендует:  Обучаемся Как убрать нумерацию страниц в Word
Понравилась статья? Поделиться с друзьями:
Кодинг, CSS и SQL