Почти всё, что вы видите в вашем браузере, передаётся на ваш компьютер через протокол HTTP. Например, когда вы открыли страницу этого урока, ваш браузер отправил множество HTTP-запросов (Request) и получил множество ответов (Response).
Заголовки HTTP (Header) являются важной составной частью этих HTTP-запросов и ответов, они передают информацию о браузере клиента, запрошенной странице, сервере и многом другом.
В данном уроке пойдет речь о том, как получить интересующую нас информацию из заголовков запроса (Request Headers) и установить определенные значения необходимым заголовкам ответа (Response Headers).
Самый простой способ получения информации о содержимом Request Headers, это выполнить запрос в опубликованном приложении и, в инструменте разработчика (F12) перейти во вкладку Networks. Выбрав отправленный запрос из списка, переключиться на вкладку Headers и найти раздел Request Headers.
Блоки для работы с заголовками в AppMaster
В AppMaster, в дизайне БП бэкенда приложения, есть возможность получить информацию из заголовка, зная его имя. Для этого используется блок БП Get Request Headers.
- Name [string] - имя заголовка, значение которого требуется получить;
- Value [string] - строковое значение параметра в заголовке.
Для того, чтобы добавить свой (кастомный) заголовок, можно использовать блок БП Set Response Header. Это требуется, если нужно вывести дополнительную информацию в заголовке ответа.
- Name [string] - имя заголовка;
- Value [string] - строковое значение заголовка.
Примеры заголовков запроса-ответа
Заголовков запросов может быть огромное множество, но некоторые из них описаны ниже (информация взята из https://www.w3.org/Protocols/HTTP/HTRQ_Headers.html):
- From - данное поле возвращает имя пользователя, отправившего запрос, в формате электронной почты. Интерпретация этого поля заключается в том, что запрос выполняется от имени указанного лица, которое принимает на себя ответственность за выполненный метод.
- Accept - данное поле содержит разделенный точкой с запятой список схем представления (значения метаинформации Content-Type), которые будут приняты в ответе на этот запрос. Данный набор может варьироваться от запроса к запросу для одного и того же пользователя.
- Пример:
Accept: text/plain, text/html
Accept: text/x-dvi; q=.8; mxb=100000; mxt=5.0, text/x-c
- Пример:
- Accept-Encoding - аналогичен Accept, но перечисляет типы Content-Encoding, которые допустимы в ответе.
- Пример:
Accept-Encoding: x-compress; x-zip
- Пример:
- Referer - необязательное поле заголовка позволяет клиенту указать в интересах сервера адрес ( URI ) документа (или элемента внутри документа), из которого был получен URI в запросе. Это позволяет серверу генерировать списки обратных ссылок на документы, для интереса, регистрации и т. д. А также позволяет отслеживать плохие ссылки. Если указан частичный URI, то он должен быть проанализирован относительно URI объекта запроса.
- Пример:
Referer: http://www.w3.org/hypertext/DataSources/Overview.html
- Пример:
- Authorization - содержит информацию об авторизации согласно указанному формату. Первое слово — спецификация используемой системы авторизации.
- Пример:
Authorization: Bearer BtHKEsVs5mNNtNf7UWoVwjJzFqLOzucA
- Пример:
- Accept-Language - аналогичен Accept, но перечисляет значения языка, которые являются предпочтительными в ответе. Ответ на неизвестном языке будет обработан.
- User-Agent - указывает программу, используемую клиентом (браузер в данном случае). Нужно для статистических целей и отслеживания нарушений протокола. Первым словом, разделенным пробелами, следует название программного продукта и (необязательно) через косую черту обозначение версии.
- Пример:
User-Agent: User-Agent: LII-Cello/1.0 libwww/2.5
- Пример:
Некоторые из заголовков ответов:
- Allowed - перечисляет набор запросов, которые запрашивающему пользователю разрешено делать для этого URL-адреса. Если эта строка заголовка пропущена, разрешенными методами по умолчанию являются «GET HEAD».
- Public - т.с., что и Allowed, но перечисляет те запросы, которые может использовать любой. Если пропущено, по умолчанию используется только "GET".
- Content-Length - подразумевает, что тело является двоичным и должно считываться непосредственно из канала связи, без разбора строк и т. д. Когда данные являются частью запроса, предотвращает экранирование и отмену экранирования завершающей последовательности.
- Content-Encoding - указывает используемый механизм кодирования. В настоящее время используются только x-compress и x-gzip.
- Content-Type - указывает тип документа.
- Content-Length - когда контент будет передаваться браузеру, сервер может указать его размер (в байтах), используя этот header.
- Last-Modified - указывает дату последнего изменения документа в формате GMT.
- Location - используется для перенаправления.
Пример использования
Рассмотрим пример получения информации об IP пользователя и его Cookie токена с помощью заголовков.
Получить информацию об IP пользователя можно с помощью заголовка x-real-ip. Информацию о Cookie токене можно получить с помощью заголовка Cookie.
Следующий БП отвечает за получение информации о токене Cookie и IP адреса:
Далее, создается эндпоинт для данного БП.
Дизайнер веб-интерфейса выглядит следующим образом:
По нажатию на кнопку, идет обращение к созданному эндпоинту с целью вызвать созданный БП. Значения на выходе данного БП передаются в значения компонентов Label. Результат скомпилированного приложения на примере ниже: