Является ли семантикой неотъемлемой части данных REST?


1

Это вопрос на вопрос, задающий вопрос explanation of REST.

Как вы можете видеть из комментариев к моему ответу, у нас был небольшой аргумент с Darrel Miller о лучшем медиаресурсе ресурсов. У нас было еще одно обсуждение по электронной почте, которое привело к этому вопросу.

Основное различие между пониманием DRERE и моим пониманием REST заключается в том, является ли семантика данных частью REST API.

Даррел считает (моя интерпретация его слов :-)), что семантика данных является неотъемлемой частью REST API, и поэтому выбранное представление мультимедиа должно отражать это. Таким образом, надлежащий REST API должен выбрать либо:

  • известный медиа, такой как ATOM, чтобы представлять данные, так что многие клиенты могли понять семантику ресурса изначально;
  • тип приложения, например application/vdn.mycomany.mymedia, и ожидайте, что клиент поймет этот тип носителя, чтобы иметь возможность потреблять данные ресурсов. Приложение/xml не является хорошим представлением ресурсов, поскольку оно не представляет семантику в типе медиа, но требует от клиента больше узнать о семантике.

С другой стороны, я считаю, что REST API представляет собой отдельный слой из фактического представления данных. Тип носителя, открытый API, представляет собой контейнер для передачи данных ресурсов. Фактическая семантика данных обрабатывается отдельно. Таким образом, клиент, который не понимает данные, все еще может использовать REST API. Приложение/xml - действительно хорошее представление данных, так как позволяет жестко связывать клиентов, которые понимают схему, но все же позволяет клиенту не понимать схему, чтобы выполнить некоторую базовую обработку ресурсов.

Таким образом, вопрос: является семантической частью данных API REST? Должны ли мы выбирать только типы медиа для представления ресурсов, которые также представляют собой семантику данных?

Я бы уклонился, если бы люди публиковали в своих ответах некоторые цитаты, предпочтительно от самого человека Роя. :-)

4

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

Без типа носителя клиент не имеет понятия, сможет ли он что-либо сделать с потоком байтов. В самом деле, когда клиент получает заголовки, определяющие application/xml, он не знает, что делать дальше, чтобы получить XML-парсер.

Таким образом, на самом деле возникает вопрос: должен ли клиент принимать решение на основе http-сообщения, не заглядывая в сообщение, или должен идти и заглядывать в сообщение (или, что еще хуже, сначала разобрать сообщение) знать, что делать.

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

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

Теперь, когда вы говорите, что семантика типов носителей является частью API API или нет, что представляет собой API?

С точки зрения клиента API отсутствует. Существует начальное представление, которое позволяет клиенту принять решение о том, что делать дальше. Тип носителя действительно там, где клиент получает необходимую ему информацию для навигации по «API», и, таким образом, API без представлений не может быть.

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

Этот контраакт говорит, что всякий раз, когда вы хотите что-то сделать, что-то будет иметь семантику: добавить клиента, отправить приложение/vnd.acme.customer + xml в/clients, используя POST.

Следовательно, мой ответ: проектирование архитектуры REST опирается на два этапа: моделирование ресурсов (на концептуальном уровне) и построение медиа-типа. Что-нибудь еще, и вы, вероятно, ошибаетесь.


0

Я не вижу необходимости быть слишком педантичным. Ресурс может выставлять несколько представлений; каждый со своей семантикой (и даже несколькими измерениями семантики при этом). Если какое-либо представление не предоставляет семантики, требуемые конкретным прецедентом, выставьте тот, который делает.

Таким образом, клиент, который не понимать данные, могут по-прежнему потребляют REST API.

Я не уверен, что это хороший экзамен лакмусовой бумажки для того, что делает или не делает достойное представление. Какая польза от клиента, который может потреблять документ, но не понимает его достаточно хорошо, чтобы что-либо сделать с ним? Наверное, я не понимаю, как «базовая обработка ресурсов» делает приложение/xml лучшим выбором, чем какой-то произвольный кадр 1s и 0s?

Поскольку вы попросили ссылки, here's an article from Roy Fielding where he "proposes" a bitmap representation of social network graphs. Я могу, конечно, получить машину для отображения этих растровых изображений, но о том, что такое использование, если я не понимаю основной график социальной сети? Будет ли изменение представления в application/xml позволять наивному клиенту извлекать из него дополнительный смысл, который не содержится в растровом изображении? Неа.

  0

Ну, вопрос не в том, является ли это достойным представлением, но можно ли все-таки назвать API RESTful. :-) 22 фев. 092009-02-22 05:57:13

  0

Я предполагаю, что здесь я не вижу необходимости быть настолько педантичным. Некоторые представления, естественно, будут более значимыми для некоторых клиентов, чем другие. Думаю, я думал, что это была дискуссия о качестве представлений без семантики, а не о достижении консенсуса в отношении того, что можно назвать REST. 22 фев. 092009-02-22 06:10:50

  0

Пример растрового изображения интересен тем, что он возвращает, что API будет возвращать тип медиаизображения, но это есть более смысловое значение, чем просто визуальный эффект, создаваемый пикселями. Это определенно противоречит моему предыдущему пониманию того, что говорил Рой. 22 фев. 092009-02-22 13:53:58

  0

Честно говоря, я понятия не имею, в какой момент я участвую в дискуссии. Я чувствую, что спорю и против вас обоих :) 22 фев. 092009-02-22 17:58:26


0

Отъезд this набор слайдов от Марка Бейкера для более подробного объяснения того, почему приложение/xml не удовлетворяет «самоописывающему» ограничению. Вы также можете прочитать несколько сообщений в своем блоге, включая this, где он продолжает объяснять, почему пространство приложений/xml + не эквивалентно медиа-типам.