Подтвердить что ты не робот

RESTful POSTS, вы делаете POST объекты единственному или множественному Uri?

Какой из этих URI будет более "подходящим" для приема POST (добавление продукта (ов))? Существуют ли какие-либо лучшие методы или это просто личные предпочтения?

/product/ (сингулярно)

или

/products/ (множественное число)

В настоящее время мы используем /products/?query=blah для поиска и /product/{productId}/ для GET PUT и DELETE для одного продукта.

4b9b3361

Ответ 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

Таким образом, вы можете проверить тип запроса, который был отправлен в веб-службу, и выполнить соответствующее действие на основе метода запроса.