RESTful POSTS, вы делаете POST объекты единственному или множественному Uri?
Какой из этих URI будет более "подходящим" для приема POST (добавление продукта (ов))? Существуют ли какие-либо лучшие методы или это просто личные предпочтения?
/product/ (сингулярно)
или
/products/ (множественное число)
В настоящее время мы используем /products/?query=blah
для поиска и /product/{productId}/
для GET PUT и DELETE для одного продукта.
Ответы
Ответ 1
Так как POST - это операция "добавить", она может быть более английской для POST до /products
, так как вы добавляете новый продукт в существующий список продуктов.
Пока вы стандартизировали что-то в своем API, я думаю, что это достаточно хорошо.
Так как API REST должен быть основан на гипертексте, URI в любом случае является относительно несущественным. Клиенты должны извлекать URI из возвращенных документов и использовать их в последующих запросах; обычно приложениям и людям не нужно угадывать или визуально интерпретировать URI, так как приложение будет явно указывать клиентам, какие ресурсы и URI доступны.
Ответ 2
Обычно вы используете POST для создания ресурса, когда вы заранее не знаете идентификатор ресурса, и PUT, когда вы это делаете. Таким образом, вы отправили POST в /products или PUT в /products/ {new-id}.
С обоими из них вы вернетесь в 201 Созданный, и с POST дополнительно верните заголовок местоположения, содержащий URL-адрес вновь созданного ресурса (при условии, что он был успешно создан).
Ответ 3
ВЫ ПОСТ или ПОЛУЧИТЕ одну вещь: один ПРОДУКТ.
Иногда вы получаете GET без определенного продукта (или с критериями запроса). Но вы все еще говорите это в единственном числе.
Вы редко работаете с множественными формами имен. Если у вас есть коллекция (Каталог продуктов), это один каталог.
Ответ 4
В дизайне RESTful существует несколько шаблонов для создания новых ресурсов. Выбранный вами шаблон в значительной степени зависит от того, кто несет ответственность за выбор URL-адреса для вновь созданного ресурса.
Если клиент отвечает за выбор URL-адреса, клиент должен указать URL-адрес ресурса. В отличие от этого, если сервер отвечает за URL-адрес ресурса, клиент должен использовать POST для ресурса "factory". Как правило, ресурс factory является родительским ресурсом создаваемого ресурса и обычно представляет собой набор, который является плюрализованным.
Итак, в вашем случае я бы рекомендовал использовать /products
Ответ 5
Я бы опубликовал только сингулярный /product
. Слишком просто смешивать два URL-адреса и путаться или ошибаться.
Ответ 6
Как многие говорили, вы, вероятно, можете выбрать любой стиль, который вам нравится, пока вы согласны, однако я хотел бы указать на некоторые аргументы с обеих сторон; Я лично склонен к сингулярному
В пользу множественных имен ресурсов:
- простота схемы URL, так как вы знаете имя ресурса всегда на множественном числе
- многие считают это соглашение похожим на то, как обращаются с таблицами баз данных и считают это преимуществом
- представляется более широко принятым
В пользу уникальных имен ресурсов (это не исключает множественные числа при работе с несколькими ресурсами)
- Схема URL более сложна, но вы получаете большую выразительность.
- вы всегда знаете, когда имеете дело с одним или несколькими ресурсами, основанными на имени ресурса, в отличие от проверки того, имеет ли ресурс идентификатор пути поиска, следующий за
- множественное число иногда сложнее для носителей без носителей (когда это не просто "s" ).
- URL длиннее
- "s" кажется избыточным с точки зрения программистов.
- просто неудобно рассматривать параметр пути как под-ресурс коллекции, а не считать его тем, чем он является: просто идентификатор ресурса, который он идентифицирует
Ответ 7
вы можете использовать один и тот же URL-адрес для всех из них и использовать MessageContext для определения того, какой тип действий вызывал вызывающий веб-сервис.
Язык не указан, но в Java вы можете сделать что-то вроде этого.
WebServiceContext ws_ctx;
MessageContext ctx = ws_ctx.getMessageContext();
String action = (String)ctx.get(MessageContext.HTTP_REQUEST_METHOD);
if(action.equals("GET")
// do something
else if(action.equals("POST")
// do something
Таким образом, вы можете проверить тип запроса, который был отправлен в веб-службу, и выполнить соответствующее действие на основе метода запроса.