Предположим, что есть контроллер, который делает одно и то же, но данные может отдавать в разных форматах (HTML/XML/JSON).
Как эстетичнее оформить эту разномятицу?
— передавать параметр требуемого формата в query string (/controller/person/1?format=json) или
— делать отдельный метод (controller/personJson/1) или
— разнести форматы по разным контроллерам или
— как-то еще?
Здравствуйте, baranovda, Вы писали:
B>Предположим, что есть контроллер, который делает одно и то же, но данные может отдавать в разных форматах (HTML/XML/JSON).
B>Как эстетичнее оформить эту разномятицу?
B>- передавать параметр требуемого формата в query string (/controller/person/1?format=json) или
B>- делать отдельный метод (controller/personJson/1) или
B>- разнести форматы по разным контроллерам или
B>- как-то еще?
IMHO, "общепринятый" вариант 1 — передать в параметрах. Гугло-апи например. Но в общем-то IMHO пофик.
Еще вариант —
указать Accept в запросе.
Тогда контроллер может сам понять в каком виде отдавать (xml/json)
Как написал комрад выше, в HTTP стандарте для этих целей определён заголовок Accept.
Поэтому правильнее ориентироваться на то, что передается в этом заголовке.
Этот вариант хорош для Web API (и в SP.NET WEB API он есть из коробки), но не прокатит,
если метод дергается из браузера, например, просто переходом по ссылке,
поскольку повлиять Accept-заголовок при этом трудно.
Если нужно поддержать оба сценария (браузер и WebAPI-клиент), то проще всего написать ActionFilter/CustomBinder/ValueProvider, который будет
заполнять соответствующий параметр экшена из Accept хидера или из Query-string.
Если нужна только поддержка в браузере — то сделать параметром и не париться.
public ActionResult GetSomeStuff(int id, SupportedFormats format = SupportedFormats.Default) // --> SupportedFormats заполняется через ActionFilter, CustomBinder или ValueProvider по переданному Accept-хидеру, если хидер не передан (или передан дефолтный, e.g. html), то берем из query-стринга