[MVC] Данные разного формата от одного контроллера
От: baranovda Российская Империя  
Дата: 21.11.14 22:21
Оценка:
Предположим, что есть контроллер, который делает одно и то же, но данные может отдавать в разных форматах (HTML/XML/JSON).
Как эстетичнее оформить эту разномятицу?
— передавать параметр требуемого формата в query string (/controller/person/1?format=json) или
— делать отдельный метод (controller/personJson/1) или
— разнести форматы по разным контроллерам или
— как-то еще?
Re: [MVC] Данные разного формата от одного контроллера
От: bnk СССР http://unmanagedvisio.com/
Дата: 22.11.14 00:23
Оценка:
Здравствуйте, 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)
Re: [MVC] Данные разного формата от одного контроллера
От: RushDevion Россия  
Дата: 22.11.14 13:32
Оценка:
Как написал комрад выше, в 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-стринга
Re[2]: [MVC] Данные разного формата от одного контроллера
От: baranovda Российская Империя  
Дата: 23.11.14 20:46
Оценка:
Здравствуйте, RushDevion, Вы писали:

RD>Как написал комрад выше, в HTTP стандарте для этих целей определён заголовок Accept.

RD>Поэтому правильнее ориентироваться на то, что передается в этом заголовке.
RD>Этот вариант хорош для Web API (и в SP.NET WEB API он есть из коробки), но не прокатит,
RD>если метод дергается из браузера, например, просто переходом по ссылке,

Мне нуна из броузера.
Накопал еще один способ, который мне понравился больше всего — приделать к action расширение:
/{controller}/{action}.{ext}/{id}
т.е.
/person/data/1
/person/data.xml/1
/person/data.json/1
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.