Есть ли стандартный способ определения CURIE в полях заголовка HTTP?

Недавно я разрабатывал RESTful API и хочу использовать поле заголовка Link для реализации HATEOAS.

Все это прекрасно и работает без каких-либо реальных проблем, но я хочу упростить работу клиентов API.

Например, заголовок Link может выглядеть так:

Link: <https://api.domain.com/orders/{id}>; rel="https://docs.domain.com/order"

В этом случае клиент должен будет найти ссылку, выполнив поиск значения https://docs.domain.com/order в атрибуте rel.

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

Поэтому я хочу попробовать использовать CURIE, чтобы вместо этого сделать что-то вроде этого:

Link: <https://api.domain.com/orders/{id}>; rel="[rc:order]"

Таким образом, проблема изменения URI по большей части смягчается, и он намного компактнее, что упрощает поиск клиентом.

Моя проблема в том, что, поскольку я использую поле заголовка Link для реализации HATEOAS, я считаю, что было бы наиболее последовательно также включать CURIE в качестве поля заголовка HTTP, а не вводить метаданные в тело ответа.

Поскольку весь API использует стандартные поля заголовка HTTP и коды состояния для всех своих метаданных (разбивка на страницы, управление версиями и т. д.), я бы предпочел не вводить метаданные в тело ответа только для того, чтобы определить CURIE.

Но если я использую поля заголовка HTTP, какое поле следует использовать для CURIE?

Есть ли стандартный способ сделать это с полями заголовка HTTP?

Если нет, должен ли я просто использовать настраиваемое поле заголовка, например X-Curie: <https://docs.domain.com>; name="rc", и просто задокументировать его где-нибудь для клиентов?

Я осмотрелся, и большинство ресурсов относятся либо к XML, либо к стандарту HAL, поэтому любая информация об этом в отношении полей заголовка HTTP будет оценена.


person Lucas    schedule 13.11.2016    source источник


Ответы (3)


Нет, ты не можешь этого сделать. Отношение ссылки представляет собой строку - не более того.

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

person Julian Reschke    schedule 13.11.2016
comment
Потому что это то, что требует RFC для веб-ссылок. В нем говорится: Приложения, которые не хотят регистрировать тип отношения, могут использовать тип отношения расширения, который представляет собой URI [RFC3986], который однозначно идентифицирует тип отношения, а затем говорит: Когда типы отношений расширения сравниваются, они ДОЛЖНЫ сравниваться как строки (после преобразования в URI, если они сериализованы в другом формате, таком как Кюри [W3C.CR-curie-20090116]). Таким образом, требуется URI и разрешено CURIE, мне просто интересно, существует ли стандартный способ определения CURIE. Это не означает, что URI определенно нестабилен, но CURIE лучше. - person Lucas; 14.11.2016
comment
По крайней мере, так я понимаю RFC. Конечно, я не должен использовать CURIE, я просто подумал, есть ли стандартный способ определить CURIE в полях заголовков HTTP, который бы немного упростил работу клиентов. - person Lucas; 14.11.2016
comment
@JakeLucas - вы неверно истолковываете эту часть; речь идет об отношениях ссылок, которые появляются в форматах, отличных от полей заголовка HTTP. - person Julian Reschke; 14.11.2016
comment
Я перечитывал RFC, но у меня возникли проблемы с некоторыми его частями. Итак, я предполагаю, что вы говорите, что что-то вроде CURIE невозможно в поле заголовка HTTP, потому что ниже сказано: обратите внимание, что типы отношений расширения ТРЕБУЮТСЯ быть абсолютными URI в заголовках ссылок? Я не заметил эту часть, поэтому, если я правильно понял, это означает, что я должен использовать абсолютный URI для rel, потому что это заголовок Link, и это все, что нужно. Это правильно? - person Lucas; 14.11.2016
comment
Да — либо абсолютные URI, либо зарегистрируйте их как связь общего назначения. - person Julian Reschke; 14.11.2016
comment
Спасибо за подтверждение :) - person Lucas; 14.11.2016

Даже если вы не используете заголовок Link, CURIE не решит проблему, которую вы представляете. Поскольку в стандарте CURIE сокращенный URI должен быть «разворачивается» перед выполнением любого сравнения. Это также применимо к сравнению с рассматриваемым отношением ссылки.

Более практичным подходом было бы создание собственного URI, например foo:order. Затем вы можете использовать какой-либо пользовательский метод сокращения URL-адреса для разрешения URL-адреса документации для рассматриваемого отношения. Этот метод используется форматами гипермедиа, такими как HAL+JSON (использование curies в форматах HAL на самом деле вводит в заблуждение, его следует использовать только как метод преобразования URL-адресов в документацию).

person Fredrik Sjöblom    schedule 17.11.2016

CURIE в свойствах rel заголовка HTTP Link не будут расширены, поскольку все свойства rel приравниваются к простым совпадениям строк, ни одно из них не рассматривается как URI.

Меня больше всего беспокоит фраза "поскольку URI для документов может измениться, он ненадежен" — тогда выберите URI, который не изменится. Даже если вы используете URL-адрес, который перенаправляет в какое-то место глубоко в документах, URI, который вы выбираете для отношения ссылки, должен быть постоянным, если вы хотите, чтобы разработчики клиента могли его разрешить.

person Nicholas Shanks    schedule 02.01.2017