Краткая версия вопроса:
Должен ли "GET" в конкретном URI совпадать с тем, что было "PUT" с этим URI?
Я думаю, что нет. И вот почему:
Учитывая, что ресурс является абстрактной вещью, которую клиент теоретически не может понять, когда мы выполняем PUT, мы должны только отправлять представление. Основываясь на расчесывании по RFC2616, не совсем ясно, что это означает для ресурса, который имеет много (потенциально бесконечных?) Представлений, но вот мои мысли; пожалуйста, скажите мне, если вы согласны:
Мое ожидание состоит в том, что если я помещаю представление в ресурс, все другие представления ресурса в этом URI должны поддерживаться согласованными (потенциально обновленными) по мере необходимости. Другими словами, вы говорите ресурсу «используйте это представление, чтобы переопределить себя».
Таким образом, я должен быть в состоянии сделать это:
PUT / resources / foo / myvacation
Тип контента: изображение / jpg
...
И следите за этим:
GET / resources / foo / myvacation
Принять: изображение / PNG
...
и получите обновленную версию myvacation в другом формате (при условии, что сервер знает, как это сделать). Экстраполируя это, этот составной атомарный PUT «изображение + метаданные» также должен быть законным:
PUT / resources / foo / myvacation
Тип содержимого: multipart / form-data
Содержание-расположение: форма-данные; имя = "документ"
Тип контента: изображение / jpg
[..]
Содержание-расположение: форма-данные; Name = "IPTC"
Тип контента: приложение / iptc
[..]
Содержание-расположение: форма-данные; Name = "" * Exif 1040 *
Тип контента: приложение / exif
[..]
И затем, поскольку согласование содержимого на стороне сервера (раздел 12.1 RFC2616) может происходить практически на основе чего угодно, для этого мы можем по умолчанию использовать содержимое документа:
GET / resources / foo / myvacation
Тип контента: изображение / jpg
[..]
или если вы верите, как я, то в разделе 3.4 RFC 2396 «Компонент запроса представляет собой строку информации, которая должна интерпретироваться ресурсом». означает, что URI со строкой запроса ссылается на тот же ресурс, что и URI без строки запроса (и изоморфен только при отправке данных application / x-form-urlencoded на ресурс), тогда это также должно быть допустимым:
GET / resources / foo / myvacation? Content = exif
Тип контента: приложение / exif
[..]
В описании PUT говорится:
Метод PUT запрашивает, чтобы вложенный объект был сохранен под предоставленным Request-URI.
Для меня это довольно анти-REST, если вы не читаете его очень либерально. Моя интерпретация такова: «Метод PUT запрашивает создание или обновление ресурса по предоставленному Request-URI на основе представления вложенного объекта».
Позже мы получим:
Принципиальное различие между запросами POST и PUT отражается в различном значении Request-URI. URI в запросе POST идентифицирует ресурс, который будет обрабатывать вложенный объект. Этот ресурс может быть процессом приема данных, шлюзом к другому протоколу или отдельным объектом, принимающим аннотации. Напротив, URI в запросе PUT идентифицирует объект, заключенный в запросе - пользовательский агент знает, для чего предназначен URI, и сервер НЕ ДОЛЖЕН пытаться применить запрос к какому-либо другому ресурсу.
Нам нужно творчески прочесть это аналогичным образом, но ключевые биты здесь: «знает, для чего предназначен URI» и «применить запрос».
Итак, для меня представление, возвращаемое GET для данного URI, не обязательно должно быть тем же представлением, которое было PUT для данного URI, оно просто должно быть согласованным.
Правда или ложь?