REST API: пользовательские заголовки HTTP и параметры URL


97

Когда вы используете настраиваемые заголовки HTTP в части запроса REST API?

Пример:

Вы бы когда-нибудь использовали

GET /orders/view 
(custom HTTP header) CLIENT_ID: 23

вместо того

GET /orders/view/client_id/23 or 
GET /orders/view/?client_id=23

Ответы:


125

URL указывает на сам ресурс. А «клиент» является ресурсом , который можно воздействовать, так должно быть частью базового URL: /orders/view/client/23.

Параметры - это всего лишь параметры доступа к ресурсу. Это особенно вступает в игру со столбиками и поиски: /orders/find?q=blahblah&sort=foo. Там тонкая грань между параметрами и суб-ресурсов: /orders/view/client/23/active versus /orders/view/client/23?show=active. Я рекомендую стиль подресурсов и резервные параметры для поиска.

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

HTTP имеет очень широкий выбор заголовков, охватывающих практически все, что вам нужно. Я видел, что пользовательские заголовки появляются в системе для системного запроса, действующего от имени пользователя. Прокси-система проверит пользователя и добавит " X-User: userid" в заголовки и будет использовать учетные данные системы для попадания в конечную точку. Принимающая система проверяет, что учетные данные системы авторизованы действовать от имени пользователя, а затем подтверждают, что пользователь авторизован для выполнения действия.


Спасибо за столь исчерпывающий ответ! Будете ли вы по-прежнему использовать X-User для мобильного API, где все еще высок риск наличия злого прокси (который удаляет заголовок)?
Василе Котовану

1
Нет, использование X-User, о котором я упоминал, относится к системным соединениям, где система действует от имени третьей стороны. Например, пользователь U обращается к серверу A. Сервер A представляет учетные данные серверу B с заголовком X-User, чтобы сказать: «Используйте мои учетные данные, чтобы проверить, что я уполномочен выполнять это действие от имени пользователя U». Это появляется в сервис-ориентированных архитектурах, и обычно вы используете HTTPS. Мобильная платформа почти всегда должна быть самим пользователем и использовать соответствующие учетные данные от первого лица для транзакции.
Nialscorva

8
Третий абзац - один из самых информативных ответов, которые я читал на SO ;-)
Alistair77

1
@Nialscorva Отличное объяснение! что, если я хочу, чтобы пользователь взаимодействовал с моим API через авторизованный контейнер (например, мое мобильное приложение)? Что я делаю сейчас, так это то, что мое мобильное приложение не авторизовано для выполнения каких-либо действий само по себе, ни конечный пользователь ... должны присутствовать оба учетных данных, если пользователь желает выполнить действие.
bolbol 03

6

Пользовательские заголовки имеют следующие преимущества:

  • Может быть легко прочитан сетевыми инструментами / скриптами (аутентификация, метаинформация, ...)
  • Защищает URL-адреса от элементов безопасности (безопаснее, не в кешах браузера / прокси)
  • Сохраняет URL-адреса более чистыми: позволяет лучше кэшировать ресурсы

они также могут быть
скрыты

@fusi хороший момент ... вот тема об этом: stackoverflow.com/questions/20820572/…
Кристоф Русси

5

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


Искренне согласен ... никогда не изобретайте велосипед заново, если есть стандартный способ выполнить задачу.
Алессандро Сантини

5

Когда вы используете ... HTTP-заголовки в части запроса REST API?

Аутентификация: идентификаторы GUID, базовая аутентификация, пользовательские токены и т. Д., Например, базовая аутентификация с токеном Guid для REST api вместо имени пользователя / пароля.

Если вы участвуете в передаче токенов или другой информации, похожей на аутентификацию, между доменами, на которые распространяется PCI-DSS или другие правила безопасности, вам также может потребоваться похоронить параметры, потому что некоторые правила явно требуют, чтобы элементы аутентификации не попадали в URL-адреса, которые могут быть тривиально воспроизведены (из истории браузера, журналы прокси и т. д.).


1

Для REST нет стандарта, но приемлемым способом будет

GET /orders/view/23

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


1

Я бы не стал использовать настраиваемые заголовки, поскольку вы не знаете, передадут ли их какие-либо прокси. На основе URL-адреса - это путь.

ПОЛУЧИТЬ / заказы / просмотреть / клиент / 23


1
Я бы тоже не рекомендовал настраиваемые заголовки, но причина не в сломанных прокси. Если прокси сломан, его нужно исправить.
Джулиан Решке

1

Определенно ОК:

GET /orders/view/client_id/23 or 
GET /orders/view/?client_id=23

Также ОК:

GET /orders/view/23 or 

Думаю, это тоже будет нормально:

POST /orders/view 
(custom HTTP header) CLIENT_ID: 23

Ответ POST в формате REST должен быть HTTP 303 с заголовком Location, установленным на что-то вроде "/ orders / view / 23".
Rich Remer

0

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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.