Передача массива в GET для вызова REST

У меня есть URL-адрес для получения встреч для пользователя следующим образом:

/user/:userId/appointments

Как должен выглядеть URL-адрес, если я хочу назначить встречи для нескольких пользователей?

должно ли быть:

/appointments?users=1d1,1d2..

Спасибо, Крис.


person ChrisOdney    schedule 14.08.2012    source источник


Ответы (6)


Коллекции — это ресурс, поэтому /appointments подойдет в качестве ресурса.

Коллекции также обычно предлагают фильтры через строку запроса, которая, по сути, является пользователями = id1, id2....

So,

/appointments?users=id1,id2 

подходит как отфильтрованный ресурс RESTful.

person bryanmac    schedule 14.08.2012
comment
Что делать, если у вас есть 30 пар ключ-значение, которые вы хотите передать? - person nclsvh; 27.04.2018

Я думаю, что лучше сериализовать параметры вызова REST, обычно путем их JSON-кодирования:

/appointments?users=[id1,id2]

или даже:

/appointments?params={users:[id1,id2]}

Затем вы раскодируете их на сервере. Это даст вам больше гибкости в долгосрочной перспективе.

Просто не забудьте URLEncode параметры, прежде чем отправлять их!

person sgress454    schedule 14.08.2012
comment
?{users:[id1,id2]} не соответствует соглашениям о параметрах строки запроса ?key1=val2&key2=val2. - person bryanmac; 14.08.2012
comment
Кроме того, есть ли у вас пример крупных сервисов, предлагающих сериализованные объекты в фильтрах строки запроса? Из того, что я видел, большинство предлагает простые фильтры параметров с разделителями-запятыми или форматы запросов, такие как OData. - person bryanmac; 14.08.2012

Другой способ сделать это, который может иметь смысл в зависимости от выбранной вами серверной архитектуры/фреймворка, состоит в повторении одного и того же аргумента снова и снова. Что-то вроде этого:

/appointments?users=id1&users=id2

В этом случае я рекомендую использовать имя параметра в единственном числе:

/appointments?user=id1&user=id2

Это изначально поддерживается такими фреймворками, как Jersey (для Java). Взгляните на этот вопрос для получения дополнительной информации. подробности.

person Gilberto Torrezan    schedule 06.03.2017

/appointments?users=1d1,1d2.. 

Это хорошо. Это в значительной степени ваш единственный разумный вариант, поскольку вы не можете передать тело с помощью GET.

person Oleksi    schedule 14.08.2012

Это сработало для меня.

/users?ids[]=id1&ids[]=id2
person Ravi MCA    schedule 18.10.2018

Вместо использования http GET используйте http POST. И JSON. Или XML

Вот как будет выглядеть ваш поток запросов к серверу.

POST /appointments HTTP/1.0
Content-Type: application/json
Content-Length: (calculated by your utility)

{users: [user:{id:id1}, user:{id:id2}]}

Или в XML,

POST /appointments HTTP/1.0
Content-Type: application/json
Content-Length: (calculated by your utility)

<users><user id='id1'/><user id='id2'/></users>

Вы, конечно, могли бы продолжать использовать GET, как вы предложили, так как это, безусловно, проще.

/appointments?users=1d1,1d2

Это означает, что вам нужно будет сделать свои структуры данных очень простыми.

Однако, если/когда ваша структура данных становится более сложной, http GET и без JSON, ваше программирование и способность распознавать данные становятся очень трудными.

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

JQuery

Если вашим клиентом является браузер и вы не используете GWT, вам следует рассмотреть возможность использования jquery REST. Google в службах RESTful с jQuery.

person Blessed Geek    schedule 14.08.2012
comment
Я не думаю, что это правильный путь. Вы ПОЛУЧАЕТЕ ресурс, а не публикуете новый. - person matthew.kempson; 27.01.2016
comment
Я не думаю, что вы понимаете использование http GET/POST. Они не соответствуют значению этих слов в английском словаре. POST - это попытка GET, но с аргументами, размещенными не в URL-адресе, а в потоке ввода-вывода. - person Blessed Geek; 27.01.2016
comment
Это очень озадачивает, когда кто-то с неадекватным пониманием метода POST, но в зависимости от значения английского словаря, может проголосовать за меня. Вы не можете винить меня за синтаксические решения, принятые людьми, которые решили определить это таким образом. Не убивайте посланника. - person Blessed Geek; 28.01.2016
comment
Вы МОЖЕТЕ использовать такой POST, но это не идиоматично. По замыслу метод запроса POST запрашивает, чтобы веб-сервер принимал и сохранял данные, заключенные в теле сообщения запроса. en.wikipedia.org/wiki/POST_(HTTP) - person pherris; 20.04.2016
comment
Благодаря историческому использованию в HTML-формах и, следовательно, не дизайну REST, который появился позже, POST использовался для того, чтобы не раскрывать параметры запроса, и до сих пор используется таким образом. И это рекомендуемая практика. Независимо от того, что говорит википедия. - person Blessed Geek; 21.04.2016
comment
RFC 1945 (1996, спецификация HTTP/1.0) указывает использовать POST для создания подчиненный ресурс. Позже RFC 7231 (2014 г., HTTP/1.1: спецификация семантики и контента) сделал его более расплывчатым, указав процесс целевого ресурса ... запрос в соответствии с собственной конкретной семантикой ресурса. Таким образом, технически RFC не ограничивают использование POST для получения некоторых данных с сервера, но препятствуют этому (в дальнейших абзацах я не буду цитировать здесь для краткости). - person J0HN; 28.02.2017
comment
Историческое использование в HTML-формах не имеет ничего общего с вопросом или REST - вы не используете бумажную почту, потому что она имеет историческое использование и некоторое время назад была рекомендованной практикой общения, верно? И это не рекомендуется в целом - только когда вам нужно преодолеть ограничение 4096 URI (хотя оно все еще действует?) или когда вы не хотите выставлять параметры (но зачем?). - person J0HN; 28.02.2017
comment
@BlessedGeek Я понял, что вы имеете в виду, и мне очень жаль, но я никогда не сделаю массив строк вместо того, чтобы изменить свой метод на POST. Полностью с тобой согласен. Я проголосовал за вас, спасибо. - person Dante Lacerda; 29.08.2017
comment
Учитывая, что браузеры и другие пользовательские агенты и веб-серверы ведут себя по-разному с POST и GET, это кажется крайне глупым. Конечно, вы можете злоупотреблять системой, но это приведет только к боли и непоследовательности. Методы HTTP имеют четко определенные и понятные значения. Люди и системы ожидают этого. Это не просто википедия кричит на ветер. - person siride; 22.01.2019
comment
Я бы сказал, что было бы лучше просто отправить идентификаторы, которые относятся к определенным объектам, чтобы получить их через HTTP GET, вместо того, чтобы использовать HTTP POST для отправки идентификаторов на сервер. Как правило, получение сложных объектов должно выполняться с помощью HTTP GET, а отправка сложных объектов — с помощью HTTP POST. Кроме того, похоже, нет необходимости в расширяемости в отношении сложности идентификатора, необходимого для получения сложных объектов, даже использование нескольких HTTP GET было бы лучше, чем использование POST. - person Lennart; 06.01.2020