Каким должен быть стандарт для URL-адресов ReSTful?

Так как я не могу найти работу в режиме chuffing, я читаю ReST и создаю веб-службы. Как я это интерпретировал, будущее - это создание веб-службы для всех ваших данных перед созданием веб-приложения. Это кажется хорошей идеей.

Однако, похоже, есть много противоречивых мыслей о том, какая лучшая схема для URL-адресов ReSTful.

Некоторые люди выступают за простые симпатичные URL-адреса

http://api.myapp.com/resource/1

Кроме того, некоторым людям нравится добавлять версию API к URL-адресу, например:

http://api.myapp.com/v1/resource/1

И чтобы сделать вещи еще более запутанными, некоторые люди выступают за добавление типа контента для получения запросов

http://api.myapp.com/v1/resource/1.xml
http://api.myapp.com/v1/resource/1.json
http://api.myapp.com/v1/resource/1.txt

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

Soooooooo.... Это много вариаций, которые оставили мне неуверенность в том, что такое лучшая схема URL. Я лично вижу достоинства наиболее полного URL-адреса, который включает номер версии, локатор ресурсов и тип содержимого, но я новичок в этом, поэтому я мог ошибаться.

С другой стороны, вы можете утверждать, что вам следует делать "все, что лучше для вас". Но это не очень подходит для менталитета РЕСТ, насколько я могу судить, поскольку цель состоит в том, чтобы иметь стандарт.

И поскольку у вас много людей, у меня будет больше опыта, чем у меня с ReST, я подумал, что попрошу совета. Итак, имея в виду все это...

Каким должен быть стандарт для URL-адресов ReSTful?

Ответ 1

Добро пожаловать в запутанный мир того, что есть и что не является REST. Сначала я бы предположил, что вы читали о REST в неправильных местах. Попробуйте RESTWiki в качестве хорошей отправной точки.

REST - отличное решение для предоставления услуг передачи данных для вашего веб-приложения. "Web-сервисы" (например, SOAP, XML-RPC, WSDL, HTTP-POX) могут быть хороши для этого, но архитектурный стиль REST гораздо более ориентирован на сценарии клиент-сервер, чем сервер-серверные сценарии.

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

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

Не используйте ресурсы версии. т.е. если у вас есть ресурс, к которому обращается URL-адрес http://example.org/TodaysWeather, никогда не создавайте ресурс в http://example.org/V2/TodaysWeather. Есть много других лучших способов представления версий, чем создание целого нового ресурса. Найдите SO для многих других обсуждений по этому вопросу.

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

И, наконец, будьте осторожны, так как REST стал модным словом du jour, есть гораздо более неверно информированный контент, чем есть допустимый контент.

Ответ 2

Глагол не может быть помещен в URL. Это бессмысленно. Это уже в заголовке запроса. Когда вы отправляете запрос POST с GET в URL-адрес, это безумно.

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

Ответ 3

Я с S.Lott - глагол * не должен быть * там, так как вы хотите использовать тот же URL-адрес для чтения записи, что и для его обновления, чтобы он квалифицировался как REST.

Контент-тип - это что-то еще, что можно оставить без изменений, поскольку это одна и та же запись, но с несколькими форматами кодирования. (Читайте на FRBR для получения большего, чем вы хотели узнать о проблемах разграничения). Решение о том, какая версия для отправки в ответ может обрабатываться с заголовками HTTP Accept.

Единственное, что я разорвано, это номер версии, так как я не могу лично думать о соответствующем HTTP-заголовке для обработки этого аспекта. (Ожидайте? Accept-Encoding? Pragma? Возможно, даже Upgrade, но вы бы чаще захотели перейти на более раннюю версию по соображениям совместимости, я бы подумал). Вероятно, у меня был бы доступ к версии без доступа, который давал самые последние но может подумать, что имеет версию version для важных изменений, которые не были обратно совместимы.

update: проблема с версией, вероятно, зависит от того, сколько у вас контроля над клиентами, подключившимися к вашим услугам... если у вас есть доступ от широкой публики (чего у меня нет), вы могут быть более заинтересованы в обратной совместимости. В зависимости от сделанных изменений возможно, что вы также можете считать "версию 2" совершенно новым ресурсом, а не просто новой "версией" оригинала.

Ответ 4

Версии: я обычно видел, что это было размещено там, где у вас есть это в вашем примере url, и если версия не указана, вы должны ответить самой последней производственной версией. Одно из соображений заключается в том, следует ли поместить версию API в строку ответа для целей отладки клиента.

Форматы ответов: формат возврата должен быть указан в заголовке HTTP Accept, отправленном пользовательским агентом.

Глаголы в строке запроса: Абсолютно нет.