Как правильно передать и обработать X-Request-ID?
Здравствуйте! В общем искал на просторах интернета информацию по тому как правильно передавать и обработать requestId на сервере. И к моему удивлению не нашел нормального примера, если тут есть те кто этим занимался, просветите меня в следующих вопросах.
1. Как правильно генерировать и передавать requestId через заголовок на сервер ?
2. Как правильно регистрировать переданный requestId . Имеется ввиду, его надо обрабатывать на PHP и где-то хранить или же это все должен делать сервер ( в моем случае nginx) ?
Если я неправильно понял саму суть requestId , тогда можете и в этом просветить)) Спасибо.
- Вопрос задан более трёх лет назад
- 6580 просмотров
Комментировать
Решения вопроса 1

nginx, js, css
Смысл requestId в том, что бы оседлать в различных логах для дальнейшего анализа работы приложения.
Обычно он создаётся как можно раньше, если мы говорим про nginx, то там уже есть (начиная с 1.11.0) переменная $request_id, которую нужно а) писать в лог nginx и б) передавать дальше в PHP (с помощью fastcgi_param). Так же можно отдавать её в http-заголовке клиенту.
Дальше, по хорошему, ваше PHP-приложение во всех своих логах тоже должно сохранять это значение, а так же передавать во все другие сервисы с которыми оно общается (базы данных, другие http-сервера и т.п.).
Ответ написан более трёх лет назад
Нравится 2 2 комментария
Nujabes37 @Nujabes37 Автор вопроса
Тогда такой вопрос, допусти мы записали $requestId в логах nginx. Но ведь при повторном запросе клиента будет генерироваться новый id-шник, правильно? Или же запросы от одного клиента будут приходить с одним requestId ?
Просто не могу понять как реализовать идемпотентный POST запрос, передавая с ним requestId.

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

Чебуратор тега РНР
Я не занимался, но прочел ответ на стаковерфлое
Генерировать уникально. UUID подойдет.
Передавать наверное через квери стринг — тогда этот ид попадет в лог веб-сервера, на случай, если пхп совсем уж упадет еще до запуска обработчика ошибок. Ну, или если такая точность не особо критична, то просто дополнительным полем в джейсон.
Плюс в обработчике ошибок РНР учитывать это значение и добавлять к сообщению об ошибке, записанному в лог.
Requests — Get Requests Request Id
Используемая версия API. Для использования этой версии API необходимо задать значение 7.1-preview.1.
Ответы
Запрос символа успешно получен в соответствии с идентификатором запроса.
Запрос символа, указанный идентификатором запроса, не найден.
Безопасность
oauth2
Type: oauth2
Flow: accessCode
Authorization URL: https://app.vssps.visualstudio.com/oauth2/authorize&response_type=Assertion
Token URL: https://app.vssps.visualstudio.com/oauth2/token?client_assertion_type=urn:ietf:params:oauth:client-assertion-type:jwt-bearer&grant_type=urn:ietf:params:oauth:grant-type:jwt-bearer
Scopes
| Имя | Описание |
|---|---|
| vso.symbols | Предоставляет возможность чтения символов. |
Примеры
Sample Request
GET https://artifacts.dev.azure.com/fabrikam/_apis/symbol/requests/9dc380b5c295c03188108014a73574987cdef9a4edce00b01c9ec2d05fa97c37?api-version=7.1-preview.1
Sample Response
Status code: 200
Определения
Состояние этого запроса.
IDomainId
Request
Идентификатор пользователя, создавшего этот элемент. Необязательный элемент.
Дата создания этого элемента. Необязательный элемент.
Необязательное описание, обращенное к человеку.
Идентификатор домена, в котором находится этот запрос. Это свойство не должно иметь значение NULL.
Необязательная дата окончания срока действия запроса. Запрос станет недоступным и будет удален после даты, независимо от его состояния. В HTTP POST, если дата окончания срока действия имеет значение NULL или отсутствует, сервер назначает данные по умолчанию об истечении срока действия (30 дней, если не переопределено в реестре на уровне учетной записи). В PATCH, если дата окончания срока действия имеет значение NULL или отсутствует, поведение заключается в том, чтобы не изменять текущую дату окончания срока действия запроса.
Идентификатор этого элемента. Необязательный элемент.
Указывает, следует ли выполнять дедупликацию фрагментов запроса.
Имя запроса, обращенное к человеку. Требуется в POST, игнорируется в PATCH.
Общий размер для этого запроса.
Состояние этого запроса.
Непрозрачный ETag, используемый для синхронизации с версией, хранящейся на сервере. Необязательный элемент.
Универсальный код ресурса (URI), который можно использовать для получения этого элемента в необработанном формате. Необязательный элемент. Обратите внимание, что это отличается от других URI, которые присутствуют в производном ресурсе.
RequestStatus
Состояние этого запроса.
Запрос создается и открыт для принятия отладочных записей.
Состояние этого запроса не определено или не имеет значения в текущем контексте.
Запрос запечатан. В нее нельзя добавить больше отладочных записей.
Запрос больше недоступен, возможно, удален.
Формат заголовка ответа
Далее после заголовка может следовать тело ответа. В случае кода ответа 200 оно содержит блоки с данными, в случае кода 402 — блок errors с подробным описанием ошибок в теле запроса и рекомендациями по их исправлению на указанном в запросе языке.
Заголовок ответа отделяется от тела ответа пустой строкой.
При возврате ошибок 4ХХ и 5ХХ в заголовке ответа запрос не будет обработан.
В случае ошибок 4ХХ необходимо исправить ошибки и повторить запрос.
В случае ошибок 5ХХ и 405 следует повторить попытку позже.
Распространенные заголовки HTTP-запросов и ответов, используемые в поиске ИИ Azure
ИНТЕРФЕЙСы REST API поиска Azure ai поддерживают набор распространенных заголовков HTTP-запросов и ответов, приведенных здесь для справки:
| Заголовок запроса | Тип | Описание |
|---|---|---|
| Принять | Тип содержимого | Запрошенный тип содержимого ответа. Значение по умолчанию — application/json;odata.metadata=minimal. Другие допустимые значения: application/json, application/json; odata.metadata=full, application/json; odata.metadata=none и text/plain (только для $count). |
| api-key | Строка | Задайте для запроса или ключа администратора в зависимости от API. |
| авторизация | Строка | Маркер доступа OAuth 2.0 для запроса. Требуется настройка службы поиска для доступа на основе ролей. Этот заголовок запроса предназначен для клиентских приложений, использующих проверку подлинности Azure Active Directory и назначения ролей Azure. Код клиента должен предоставить маркер. Этот заголовок запроса можно использовать с любой поддерживаемой версией REST API, если служба поиска настроена для проверки подлинности на уровне данных. |
| Content-Type | Content-Type | Тип содержимого текста запроса (PUT или POST). По умолчанию — application/json . |
| client-request-id | GUID | Необязательный идентификатор запроса, заданный вызывающим абонентом, в виде GUID без оформления, например фигурные скобки (например, client-request-id: 9C4D50EE-2D56-4CD3-8152-34347DC9F2B0). Определяемое вызывающим объектом значение, по которому можно идентифицировать данный запрос. Если это значение указано, оно будет включено в ответное сообщение для сопоставления запроса. |
| OData-MaxVersion | «4.0» | Задает максимальную версию протокола OData, поддерживаемую клиентом. Значение по умолчанию — «4.0». |
| Prefer | «return=representation» или «return=minimal» | Используется для управления полезными данными ответа от запросов PUT и POST /indexes. Значение по умолчанию — «return=representation» при создании нового индекса с помощью POST и PUT и «return=minimal» для обновления существующего индекса с помощью PUT. |
| return-client-request-id | Значение true или false | Если этот параметр указан, когда задан client-request-id, сервер включает в ответ заголовок client-request-id. Значение по умолчанию — False. |
| If-Match | ETag или * | Используется для изменения ресурса, только если текущая версия соответствует указанному ETag. Используйте этот заголовок с методами POST, PUT или DELETE для ресурсов (таких как индексаторы, индексы и источники данных, но не документы), чтобы обеспечить управление оптимистичным параллелизмом. |
| If-None-Match | ETag или * | Используется для изменения ресурса, только если текущая версия не соответствует указанному ETag. Используйте этот заголовок с методами POST, PUT или DELETE для ресурсов (таких как индексаторы, индексы и источники данных, но не документы), чтобы обеспечить управление оптимистичным параллелизмом. |
| Заголовок ответа | Тип | Описание |
|---|---|---|
| client-request-id | GUID | Идентификатор, указанный вызывающим объектом в исходном запросе, если он имеется. |
| Content-Type | Content-Type | Тип содержимого текста ответа. |
| Расположение | URL-адрес | URL-адрес созданного определения индекса для запросов POST и PUT /indexes. |
| OData-Version | «4.0» | Версия протокола OData ответа. |
| request-id | GUID | Уникальный идентификатор текущей операции. Равен client-request-id, если указан; в противном случае значение создается на сервере. |
| elapsed-time | Число | Время в миллисекундах, затраченное службой на обработку запроса. Включено только время, затраченное на обработку запроса, но не время передачи по сети. |
| ETag | Строка | Непрозрачная строка, представляющая текущую версию ресурса (возвращается для индексаторов, индексов и источников данных, но не для документов). Используйте эту строку в заголовке If-Match или If-None-Match для управления оптимистическим параллелизмом. |