Подтвердить что ты не робот

PHP и пользовательские заголовки HTTP, плохая практика?

У меня есть пользовательская реализация RESTful API для PHP-приложения, которое возвращает данные json, и для того, чтобы сообщить о статусе операции, то есть были ли ошибки в запросе, я устанавливаю пользовательский заголовок HTTP с (очень крошечный) json-объект в виде строки. Это хорошо работает, так как я могу отправлять ответы и легко извлекать их на стороне клиента, не испортив фактические отправленные данные.

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

4b9b3361

Ответ 1

Это интересный вопрос. Не должно быть никаких причин для его возникновения, но вы должны учитывать несколько вещей:

  • Заголовки должны быть уникальными для вашего приложения. Не только сейчас, но и навсегда. Вы должны убедиться, что вы их префикс, например. X-MyApplication-Foo: Bar. Не делать этого может привести к конфликтам в будущем.

  • Брандмауэры иногда (редко) немного переусердствуют с фильтрацией неизвестных HTTP-заголовков. Это не должно быть проблемой, но это нужно иметь в виду.

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

Есть ли причина, по которой вы не можете использовать стандартные коды ошибок HTTP? Я понимаю, что вам может понадобиться предоставить трассировки стека или другую полезную информацию для отладки, но в случае ошибки не вы бы просто вернули бы кусок JSON, содержащий информацию об ошибках, а не обычные данные "результата" JSON? Вы можете легко обнаружить разницу на основе кода ошибки HTTP и обрабатывать два случая по-разному.

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

Пример псевдокода:

switch(httpResponseCode)
{
    case 200:
        parseResult(json);
        break;
    case 403:
        parseForbidden(json);
        break;
    case 500:
        parseServerError(json);
        break;
    default:
        // bad response code, handle appropriately
}