Как видно из названия — это действительно?
Что я имею в виду
Если я позвоню конечной точке с GET
тогда правильно ли делать
http://some.thing/more?id[]=12&id[]=4&id[]=65
позволить серверу вернуть несколько объектов одновременно?
Я не мог видеть никаких примечаний в документах RFC. Кроме того — глядя на коды состояния, чтобы вернуться — кажется, не строить таким образом.
Так что я думаю, GET или DELETE или HEAD запрос только для одного объекта?
РЕДАКТИРОВАТЬ: язык, кстати, PHP
EDIT2: это то, что я хочу избежать: https://stackoverflow.com/a/18141127/3411766
Я не хочу использовать тело.
Вы можете делать правильные HTTP-запросы, но идти против конструкции HTTP. В своем ответе я остановлюсь на правильном дизайне HTTP.
Во-первых, когда вы делаете запросы GET, вы всегда получаете представление ресурса. Даже если URL представляет собой что-то вроде «коллекции ресурсов», в HTTP нет строгого определения этого. Этот список ресурсов может по-прежнему представлять несколько «сущностей», приходящих из вашей модели данных.
Так что призыв к /users
может вернуть несколько пользовательских объектов.
Точно так же, DELETE
для пользователей может означать, что вы удаляете весь /users
Коллекция и все в этом.
Одна проблема, на которую я смотрю, и на которую у меня нет хорошего ответа, заключается в том, что вы используете строку запроса для удаления нескольких ресурсов. Я думаю, что это хорошо для GET
/ HEAD
, но я спрашиваю, правильно ли это для DELETE
также. Это определенно кажется мне немного странным, потому что я чувствую, что DELETE
на /users?foo=bar
следует удалить /users
и обычно это происходит из-за того, как работает большинство фреймворков. Должно ли это? Я на самом деле не уверен. REST не является строго стандартом, поэтому мы не можем найти там ответы, и все, что я получил, это то, что он «чувствует себя неправильно». Я понимаю, что вы не строго запрашиваете REST, поэтому со строгой точки зрения HTTP это определенно нормально.
Однако вы можете структурировать свои URL так, чтобы они не выглядели так:
/users?id[]=12&id[]=4&id[]=65
но вместо этого как то так:
/users/12,4,65
Я видел, как другие делают это, и мне это кажется немного менее неправильным. Но это в основном гипотеза.
Независимо от того, если вы делаете DELETE
на нескольких подобных объектах запрос должен либо успешно выполняться, либо вообще ничего не делать. Частичный успех не принимается, поэтому вы можете просто использовать обычные коды ответов 200/204 для указания успешного удаления.
Других решений пока нет …