Зачем нам нужен пользовательский тип мультимедиа при использовании гипермедиа-ссылок?

В настоящее время я разрабатываю корпоративную службу, ориентированную исключительно на ресурсы. Прочитав несколько блогов, книг и т. д., я считаю, что REST со ссылками Hypermedia — это то, что нужно.

Тем не менее, во всех этих блогах и книгах говорится о том, что нельзя использовать application/xml в качестве типа мультимедиа при использовании гипермедиа-ссылок в ответе. Ни один из них не говорит, почему, за исключением общего утверждения, такого как - простые URI без типа отношения ссылки не сообщают семантику URI клиентам.

Насколько я понял, рекомендуется определить свой собственный пользовательский тип носителя и сообщить клиенту, как его читать. Но если известно, что клиенты, подключающиеся к моему сервису, никогда не будут браузерами, имеет ли это значение? Разве я не могу просто указать эти ссылки в своем ответе с типом application/xml?

Я надеялся, что кто-то здесь может подробнее рассказать об этом.


person Sharat    schedule 17.04.2013    source источник


Ответы (2)


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

Одна из проблем с application/xml заключается в том, что в нем нет стандартного определения того, как выглядит ссылка. Это

<Link rel="foo" href="/foo">

or is it

<foo href="/foo">

или какой-то другой вариант? Как ваш клиент может узнать, как определить, какие ссылки существуют в документе, не используя «внеполосные» знания? «Внешние» знания — это то, чего следует избегать, потому что именно они приводят к сбою клиентов, когда серверы вносят изменения, и клиент не может защитить себя от изменений внеполосных знаний.

Другая проблема с application/xml заключается в том, что он не содержит семантики, кроме иерархии элементов и атрибутов. Семантика должна быть передана либо типом носителя, либо отношением ссылки. Если вы используете application/xml, вы должны использовать отношения ссылок, чтобы сообщить клиенту, как использовать этот документ.

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

Я бы посоветовал взглянуть на application/hal+xml. Это ближе всего к общему XML, но с определенной семантикой ссылок.

person Darrel Miller    schedule 17.04.2013
comment
+1 хороший пост - хотя я бы сказал, что проблема на самом деле не в том, что application/xml не содержит «стандартный» тип ссылки - на самом деле это проблема вашей спецификации API. Клиенты должны реализовать любую директиву обработки, которую вы выберете. Я думаю, что настоящая проблема, как я сказал в своем ответе, заключается в том, что никто, кажется, не в состоянии придумать директивы обработки наравне с гибкостью, предоставляемой text/html (что заставляет меня задаться вопросом, почему мы не используем HTML для наших API? Много кода с открытым исходным кодом, и клиентам не нужно ничего рендерить. Пища для размышлений.) - person Doug Moscrop; 17.06.2013
comment
Кроме того, я не согласен с вашей точкой зрения вне диапазона знаний. формат здесь не проблема - иначе я мог бы утверждать, что HTML требует внеплановых знаний о том, что такое элемент привязки или что такое элемент ввода. Этот материал четко определен как основа модели обработки для HTML. То же самое относится и к вашему API, но он должен быть гибким. JSON/XML/YAML не являются проблемой, потому что их формат является гибким, они представляют собой проблему, потому что у них нет четко определенной директивы для элементов управления гипермедиа. (это больше, чем просто гиперссылки). - person Doug Moscrop; 17.06.2013
comment
@Doug И у Джона Мура, и у Майка Амундсена есть ряд статей/видео об использовании xhtml для API. Это довольно распространенный подход. HTML не требует дополнительных знаний для ссылок, потому что заголовок Content-Type указывает на text/html, а реестр IANA указывает на спецификацию HTML, которая определяет синтаксис ссылки. В спецификации application/xml этого нет. - person Darrel Miller; 17.06.2013
comment
Я проверю их - спасибо! Я не знал, что это было распространено, но, тем не менее, я подозреваю, что нет недостатка в людях, которые бы дважды восприняли подобную концепцию (особенно если она исходит из неавторитетного источника или в противном случае никто не такой как я) с некоторым видом Какие? Это информация о макете для браузера! - person Doug Moscrop; 19.06.2013

Вот лучший ответ, который я могу придумать... Недавно я связался с доктором Филдингом, чтобы подтвердить свое понимание, но еще не получил ответа. Если он накричит на меня, я отредактирую это.

Я подозреваю, что, как Даррел Миллер упомянул, цель должна состоять в том, чтобы избежать создания слишком конкретных типов - в конце концов, это было сказано:

REST API никогда не должен иметь «типизированных» ресурсов, важных для клиента.

Я чувствую, что большая часть контента в Интернете, касающегося Hypermedia в том, что касается REST, по существу нарушает этот принцип и направляет людей в неправильном направлении, потому что они вводят очень специфические «квалификаторы» (как я буду называть их) к своим ресурсам.

Вы видите такие вещи, как application/vnd.com.foo.bar+xml или application/vnd.com.example.thing+json - некоторые люди решили, что вместо использования самого типа они будут использовать параметры, например. application/xml; someKey=someValue -- это, на мой взгляд, ничем не отличается от квалификации. Для меня это типизированный ресурс.

text/html является воплощением гипертекста по той причине, что у браузера есть директива обработки, которую он использует для понимания этого типа мультимедиа. Не только рендеринг и макет, но и надежные прецеденты взаимодействия устанавливаются спецификациями HTML (например, теги привязки вызывают поиск, формы могут инициировать отправку с кодированием и т. д.), и именно по этой причине этот очень общий, очень мощный тип гипермедиа позволил всем веб-страницам, которые мы используем сегодня, появиться без какой-либо связи между вашим браузером и сервером, который их предоставляет - единственное, что необходимо, - это понимание того, что такое HTML как тип контента.

Что это означает для API? Это означает, что создание типа контента, специфичного для некоторого ресурса, определенного URI (или их набора) не использует строго гипермедиа и, вероятно, означает, что у вас есть связь между клиентом и сервером, которую REST пытается избежать. Это также означает, что application/xml и им подобные малокровны — у них есть директивы синтаксического анализа, но нет директив обработки. Хорошо спроектированный REST API будет иметь гораздо более общий тип гипермедиа, созданный не для конкретного ресурса, а скорее для четкого определения директив обработки, которые потенциальные клиенты должны понимать, чтобы участвовать.

Интересно и, по общему признанию, вероятно, спорно, то, что в text/html уже много чего есть - почему бы не использовать это? Тот факт, что наши потребители API хотят чего-то другого, кроме HTML (например, они думают, что форматы JSON или XML являются панацеей), на самом деле происходит из-за врожденного непонимания того, что означает иметь механизм приложения, управляемый гипермедиа, а именно, что директива обработки представление должно быть довольно общим. Конечно, вы можете сделать это с помощью XML, просто задав в своем API четкий набор элементов и их значение. Часть об использовании HTML была просто для иллюстрации.

Начинающие REST API, даже с богатым набором гиперссылок, выражающих переходы между состояниями через ресурсы, могут — и чаще всего так и происходит — не соответствовать тому расширяемому, долговечному архитектурному стилю, который на самом деле представляет собой REST.

person Doug Moscrop    schedule 16.06.2013
comment
Я плохо сформулировал свой ответ. Не у REST есть какое-либо мнение о том, насколько специфичен ваш тип медиа, а в сообществе REST есть страх перед взрывным ростом типов медиа. Меня меньше беспокоят конкретные типы мультимедиа и больше беспокоят люди, создающие типы мультимедиа, которые полезны только для одного API. Я хочу, чтобы было создано много типов мультимедиа, которые можно было бы повторно использовать во многих API. - person Darrel Miller; 17.06.2013
comment
Я думаю, вы слишком интерпретируете то, что Филдинг имел в виду под API, который никогда не должен иметь типизированных ресурсов. Далее в абзаце говорится: «Единственными типами, важными для клиента, являются тип носителя текущего представления и стандартизированные имена отношений». Типы носителей — это типы. То, что, как я полагаю, говорит fielding, если вы делаете GET /Customer и возвращаете application/xml, вы не можете сделать предположение, что в этом XML сериализован тип Customer. - person Darrel Miller; 17.06.2013
comment
В целом я согласен с тем, что вы говорите. Я бы не стал использовать термин инструкции по обработке, потому что application/xml действительно определяет эту концепцию. Я думаю, что элементы управления гипермедиа — это гораздо лучший термин для обозначения того, чего не хватает в app/xml. Однако HTML — не единственный формат, позволяющий создавать системы RESTful. Collection+json и HAL — это два довольно новых формата, которые в сочетании с отношениями ссылок могут быть весьма эффективными. - person Darrel Miller; 17.06.2013
comment
Я не уверен в этом - если вы слишком укажете тип носителя для ресурсов, то вы фактически создадите статически типизированный интерфейс, не так ли? HTML — это воплощение гипертекста и REST, поскольку он представляет собой единый веб-интерфейс. Я бы не хотел, чтобы мой браузер понимал приложение/банковский счет больше, чем приложение/клиент. Есть смысл? Элементы управления гипермедиа в HTML очень и очень общие. Я полагаю, что нам, вероятно, нужно какое-то подмножество в пределах определенного домена приложения, но не на уровне ресурсов. - person Doug Moscrop; 19.06.2013
comment
Я согласен, вы не можете сделать предположение, что у вас есть customer внутри вашего application/xml, но именно потому, что вам не нужно знать, что это является клиентом. В представлении должны присутствовать элементы управления гипермедиа, основанные либо на HTML, либо на любом другом указанном вами API, которые описывают возможность запроса, например, среди других переходов состояний, доступных благодаря связям гиперссылок. - person Doug Moscrop; 19.06.2013
comment
Я, безусловно, понимаю, что HTML — не единственный формат для создания системы гипермедиа — просто это довольно богатый язык, который определяет элементы управления гипермедиа, удовлетворяющие большинству взаимодействий с минимально возможной специфичностью — отсюда и наша способность использовать HTML для общения такими, какие мы есть. , а также войти в Facebook (если есть такое желание), банк онлайн и т.д. - person Doug Moscrop; 19.06.2013
comment
HTML не является единым интерфейсом, HTTP есть. HTML имеет семантику типов в области текстовых документов. например h1, head, body, p, br, table и т. д. Интернет не будет работать без text/css, x-application/x-www-urlencoded-form, image/png и т. д. Все это точно определенные типы. - person Darrel Miller; 19.06.2013
comment
Да, я согласен с вами, что Html является достаточно общим, чтобы представлять интерфейс для огромного количества доменов приложений на стороне чтения. Тем не менее, я нахожу HTML-формы довольно ограниченными в своих возможностях и обычно требуют JS, чтобы расширить их возможности до чего-то приличного. Поддержка JS на клиенте — нетривиальная задача. - person Darrel Miller; 19.06.2013
comment
Так что HTTP — это унифицированный интерфейс — я вижу это после повторного просмотра диссертации. Однако директивы обработки HTML по-прежнему предписывают клиенту отправить urlencoded-form, не так ли? Так что моя точка зрения не в том, что в сети есть только один тип (примечание: я не согласен с тем, что сеть не работает без text/css), а в том, что эти типы не определены для ресурсов. Я не согласен с чрезмерной конкретностью, а не с тем, что я верил, что у нас есть единый язык гипермедиа или что-то в этом роде. - person Doug Moscrop; 19.06.2013
comment
Можете ли вы привести пример того, как HTML-формы ограничены так, как вы хотите? Мне не кажется, что я когда-либо сталкивался с HTML-формой, которая не могла передать то, что я мог сделать в контексте управления гипермедиа. Конечно, использование чистых форм для представления передачи состояния по частям может быть скучным или даже ужасным для пользователей, но это кажется неуместным при обсуждении фактического механизма, с помощью которого сервер сообщает о доступности указанных элементов управления гипермедиа. Дискуссия здесь заключается в том, должна ли специфичность происходить на уровне ресурсов. - person Doug Moscrop; 19.06.2013
comment
Я беру свои слова обратно, что HTTP является единым интерфейсом. И да, гипермедиа — это часть единого интерфейса. Я просто хочу сказать, что HTML — это только один тип медиа, а не то, от чего мы должны чрезмерно зависеть. - person Darrel Miller; 19.06.2013
comment
Согласен - я проверил ваш блог и буду продолжать это делать. Это забавно, потому что я участвовал в побочной беседе с коллегой и согласился, что HTTP можно рассматривать как единый интерфейс WWW как приложение поверх Интернета. В любом случае, я думаю, мы заслужили новый значок Stack Overflow: [Обсудить REST, не споря и не оскорбляя друг друга] Ура :) - person Doug Moscrop; 19.06.2013