Ваш вопрос имеет много ответов на Stackoverlow, но большинство из них окутывают причину, о которой вы спрашиваете, и я подозреваю, что вы всегда находите их частично неудовлетворенными.
Если мы возьмем Роя Филдинга за его слово, невозможно написать большинство коммерческих интерактивных клиентских приложений как SOA RESTful/HATEOAS, используя HTTP/HTML. Возможно, это возможно в других средах, я не могу сказать.
Так практический ответа «посмотреть его в документации» и «написать клиент с этим приложением-знанием в я т» с боковой порцией "игнорировать тот факт, что мы «нарушая правила Филдинга, делая это».
Я склонен создавать JSON ответы, которые обеспечивают этот подход:
GET /account/12345 HTTP/1.1
{
"account": {
"number": "12345",
"currency": "usd",
"balance": "100.00",
"deposit": {
"href": "/account/12345/deposit",
"action": "POST"
},
"withdraw": {
"href": "/account/12345/withdraw",
"action": "POST"
},
"transfer": {
"href": "/account/12345/transfer",
"action": "POST"
},
"close": {
"href": "/account/12345/close",
"action": "DELETE"
}
}
}
... добавить дополнительные свойства конструкции по мере необходимости, но эти основы.
Я считаю, что это позволяет потребителю (клиентам) потребления писать RESTful способом, но при этом я использую Тело ответа, которое, по словам Филдинга, не то, что он намеревался.
Я бы предложил такое объяснение индивидуальный к ответу, хотя:
Филдинг говорит: «Я получаю разочарование по количеству людей, призывающих любой HTTP-интерфейс на основе REST API.» (http://roy.gbiv.com/untangled/2008/rest-apis-must-be-hypertext-driven).
Обратите внимание, как он так остро говорит «any« HTTP-интерфейс.
Самый актуальный сегмент в его «лекции» заключается в следующем:
"Отдыхают API должны быть введены без предварительного знания за пределами исходного URI (закладки) и набор стандартных типов носителей, которые подходят для предполагаемой аудитории (т. е. ожидается, что ее понимает любой клиент, который может использовать API). С этого момента все переходы состояния приложения должны управляться выбором клиента по предоставленным сервером вариантам, которые присутствуют в полученных представлениях или подразумеваются путем манипулирования пользователем этими представлениями. Переходы могут быть определены (или ограничены) знаниями клиента о типах медиа и механизмах обмена ресурсами, как из h может быть улучшено «на лету» (например, код по требованию). [Failure здесь означает, что вне полосы информация является движущей силой взаимодействия вместо гипертекста.] "
Он говорит, что это потому, что HTTP/HTML приложение URI медиа-типа просто„текст/html“, и где это глагол в этом? Нет никого.URI не может рассказать вам, что для чего-то требует Verb для использования/навигации, вы не можете использовать только данные внутри диапазона, чтобы динамически создавать «следующую» навигацию в своем клиенте.
Он пояснил, что считает, что мы предоставляем наши URI как часть CDATA, которая включает в себя «метод» или что контекст URI сам по себе обеспечит его, как это делает элемент FORM. Он явно решает против API OpenSocialst REST, заявляя, что он не RESTful.
Здесь: «элементы привязки с атрибутом href создают гипертекстовую ссылку, которая при выборе вызывает запрос на поиск (GET) в URI, соответствующий атрибуту href, кодированному CDATA». Идентификаторы, методы и типы файлов являются ортогональными проблемами - методы не задаются типом медиа. Вместо этого тип носителя сообщает клиенту, какой метод использовать (например, якорь подразумевает GET) или как определить используемый метод (например, элемент формы говорит, чтобы искать в атрибуте метода). Клиент должен уже знать, что означают методы (они универсальны) и как разыгрывать URI.
Обратите внимание, что он говорит, что клиент уже должен знать, что методы означают, он не говорит о том, что клиент уже должен знать, что они являются - вот почему вы спросили ваш вопрос. Многие люди борются с этим, потому что мы фактически не создаем наши приложения, как это, в большинстве сред SOA.
Как и многие инженеры, я просто хочу, чтобы Филдинг вышла с разъяснением или повторным заявлением, но не только он этого не сделал, он опубликовал еще два указаний на нас, как инженеров, удвоив его заявив, что мы должны перестать называть RESTful нашего API и признать, что мы создаем RPC.
Я думаю, что подобный JSON подход является мостом reasoble, но у меня нет ответа на то, что мы используем тело запроса для этого, а не полагаемся на Media Type, чтобы это подразумевалось.
И, наконец, есть новый глагол в HTTP, называемый OPTIONS, который для данного URI будет вернуть допустимый список действий Verb. Я думаю, что у Филдинга была написана эта HTTP-версия. Это позволило бы Клиенту в целом создавать URI-навигацию без запрещенного внутреннего знания приложений. Но есть три проблемы, которые я могу думать в реальном мире:
- вы бы кодировать механизм в вашей службе Aggregation, чтобы сделать этот вызов для каждого URI вы пытаетесь вернуться, и так много данных содержит много адресов URI (_links в HAL), который добавляет много дополнительных «перелетов» в вашу конструкцию Response Response. Вероятно, мы все будем жаловаться на это.
- Практически ни один SOA-сайт, претендующий на роль RESTful, фактически реализует вызов-метод-метод OPTIONS, чтобы вы могли выполнить этот запрос в любом случае.
- Мы все будем жаловаться на «ненужные» дополнительные звонки, которые он добавляет (особенно в мире электронной коммерции), на обработку Клиента и его тенденцию подталкивать нас к требованиям SLA.
Вы не должны использовать свои собственные глаголы. Вы должны выпустить 'DELETE' на'/account/12345', 'PUT'over'/account/12345' с новым итогом, [или лучше 'POST' для'/account/12345/operations' с правильным телом , – moonwave99
@ moonwave99 - но как вы на самом деле знаете? Вы просто делаете предположение, которое может соответствовать или не соответствовать тому, что построил API-интерфейс. – user2088756