Мы запускаем новый REST API, и я хотел, чтобы сообщество внесло свой вклад в передовые практики, касающиеся того, как мы должны отформатировать входные параметры:
Прямо сейчас наш API очень ориентирован на JSON (возвращает только JSON). Дискуссия о том, хотим ли мы / нужно ли возвращать XML, является отдельной проблемой.
Поскольку наш выход API ориентирован на JSON, мы пошли по пути, где наши входы немного ориентированы на JSON, и я подумал, что это может быть удобно для некоторых, но в целом странно.
Например, чтобы получить несколько подробностей о продукте, по которым можно одновременно извлечь несколько продуктов, у нас есть:
http://our.api.com/Product?id=["101404","7267261"]
Должны ли мы упростить это как:
http://our.api.com/Product?id=101404,7267261
Или удобен ввод данных в формате JSON? Больше боли?
Мы можем хотеть принять оба стиля, но действительно ли эта гибкость вызывает больше путаницы и головных болей (ремонтопригодность, документация и т. Д.)?
Более сложный случай, когда мы хотим предложить более сложные входные данные. Например, если мы хотим разрешить несколько фильтров для поиска:
http://our.api.com/Search?term=pumas&filters={"productType":["Clothing","Bags"],"color":["Black","Red"]}
Мы не обязательно хотим помещать типы фильтров (например, productType и color) в качестве имен запросов, например:
http://our.api.com/Search?term=pumas&productType=["Clothing","Bags"]&color=["Black","Red"]
Потому что мы хотели сгруппировать все входные данные фильтра.
В конце концов, действительно ли это имеет значение? Вполне вероятно, что существует так много утилит JSON, что тип ввода не имеет большого значения.
Я знаю, что наши клиенты JavaScript, делающие AJAX-вызовы API, могут по достоинству оценить входные данные JSON, чтобы сделать их жизнь проще.
[]
синтаксис не всегда поддерживается (и, несмотря на то, что он распространен, может даже нарушать спецификацию URI). Некоторые HTTP-серверы и языки программирования предпочитают просто повторять имя (напримерproductType=value1&productType=value2
)./user/
и в теле, я пришлю{ q:{}, d: {} }
сq
в запросе, с пользователем , будут запрошены в БД и вd
качестве измененных данных.Стандартный способ передать список значений в качестве параметров URL - это повторить их:
http://our.api.com/Product?id=101404&id=7267261
Большая часть кода сервера будет интерпретировать это как список значений, хотя у многих есть упрощения с одним значением, поэтому вам, возможно, придется поискать.
Значения с разделителями тоже в порядке.
Если вам нужно отправить JSON на сервер, мне не нравится видеть его в URL (это другой формат). В частности, URL имеют ограничение по размеру (на практике, если не в теории).
Я видел, как некоторые выполняют сложный запрос RESTful, в два этапа:
POST
требования вашего запроса, получение идентификатора (по сути, создание ресурса критериев поиска)GET
поиск, ссылающийся на вышеуказанный идентификатористочник
Первый:
Я думаю, что вы можете сделать это 2 способами
http://our.api.com/Product/<id>
: если вы просто хотите одну записьhttp://our.api.com/Product
: если вы хотите все записиhttp://our.api.com/Product/<id1>,<id2>
: как предположил Джеймс, это может быть вариант, так как то, что следует после тега Product, является параметромИли мне больше всего нравится:
Вы можете использовать Hypermedia как свойство состояния приложения (HATEOAS) для RestFul WS и выполнять вызов,
http://our.api.com/Product
который должен возвращать эквивалентные URL-адресаhttp://our.api.com/Product/<id>
и вызывать их после этого.второй
Когда вам нужно делать запросы по URL-адресам. Я бы предложил снова использовать HATEOAS.
1) позвонить
http://our.api.com/term/pumas/productType/clothing/color/black
2) позвонить
http://our.api.com/term/pumas/productType/clothing,bags/color/black,red
3) (Используя HATEOAS) Позвоните по адресу: http://our.api.com/term/pumas/productType/ -> получите URL-адреса всех возможных URL-адресов одежды -> позвоните по желанию (одежда и сумки) - > получить возможные цветовые URL -> назвать те, которые вы хотите
источник
Вы можете проверить RFC 6570 . Эта спецификация шаблона URI показывает много примеров того, как URL могут содержать параметры.
источник
Первый случай:
Нормальный поиск продукта будет выглядеть так
http://our.api.com/product/1
Так что я думаю, что лучшая практика будет для вас, чтобы сделать это
http://our.api.com/Product/101404,7267261
Второй случай
Поиск с параметрами строки запроса - хорошо, как это. Я хотел бы объединить термины с AND и OR вместо использования
[]
.PS Это может быть субъективно, поэтому делайте то, что вам удобно.
Причиной размещения данных в URL является то, что ссылка может быть вставлена на сайт / разделена между пользователями. Если это не проблема, во всех случаях используйте вместо этого JSON / POST.
РЕДАКТИРОВАТЬ: Если подумать, я думаю, что этот подход подходит для сущности с составным ключом, но не для запроса для нескольких сущностей.
источник
/
не должно быть конца, поскольку URI обращается к ресурсу, а не к коллекции.Я согласен с ответом nategood, так как он завершен, и он, кажется, удовлетворяет ваши потребности. Тем не менее, я хотел бы добавить комментарий об идентификации нескольких (1 или более) ресурсов таким образом:
http://our.api.com/Product/101404,7267261
При этом вы:
Сложите клиентов , заставив их интерпретировать ваш ответ как массив, что для меня будет нелогично, если я сделаю следующий запрос:
http://our.api.com/Product/101404
Создайте избыточные API с одним API для получения всех продуктов и одним выше для получения 1 или многих. Поскольку вам не следует показывать пользователю более 1 страницы подробностей ради UX, я считаю, что более 1 идентификатора будет бесполезным и будет использоваться исключительно для фильтрации продуктов.
Это может быть не так проблематично, но вам придется либо обрабатывать это самостоятельно на стороне сервера, возвращая одну сущность (проверяя, содержит ли ваш ответ один или несколько), либо позволить клиентам управлять ею.
пример
Я хочу заказать книгу из Amazing . Я точно знаю, что это за книга, и вижу ее в списке при переходе по книгам ужасов:
После выбора второй книги, я перенаправлен на страницу с подробным описанием книжной части списка:
Или на странице, дающей мне полную информацию только об этой книге?
Мое мнение
Я бы предложил использовать идентификатор в переменной пути, когда уникальность гарантируется при получении деталей этого ресурса. Например, приведенные ниже API-интерфейсы предлагают несколько способов получения сведений о конкретном ресурсе (при условии, что продукт имеет уникальный идентификатор, а спецификация для этого продукта имеет уникальное имя, и вы можете перемещаться сверху вниз):
В тот момент, когда вам нужно более 1 ресурса, я бы предложил отфильтровать большую коллекцию. Для того же примера:
Конечно, это мое мнение, поскольку оно не навязано.
источник