Опция № 3, устанавливающая заголовок HTTP «Accept», больше соответствует спецификации HTTP и среди пуристов REST считается наиболее правильной. Это также означает, что вы сохраняете один и тот же URL-адрес (ресурс) независимо от того, что это за представление.
Однако вы можете столкнуться с пользовательскими агентами, которые не могут установить заголовок Accept, поэтому рекомендуется поддерживать механизм резервного копирования для указания формата ответа. В этом случае я предлагаю параметр строки URL-запроса. Использование параметра строки запроса URL-адреса означает, что вы сохраняете один и тот же основной URL-адрес независимо от типа возвращаемого содержимого. Это делает более понятным, что клиенты должны выдавать PUT только на этот URL, а не на /foo/bar.json или /foo/bar.xml URL.
Редактировать. Еще одна вещь, которую следует учитывать, если вы решите использовать суффикс URL (т.е. foo.json и foo? Format = json), это то, что у вас могут возникнуть проблемы с кэшированием прокси. Если кто-то выдает PUT для /foo.json, прокси не будет интерпретировать это как запрос на аннулирование /foo.xml. Однако, если вы используете / foo? Format = json, то все они хранятся в том же ресурсе (/ foo) в прокси.