Как заставить ASP.NET Web API возвращать данные JSON или XML на основе моего ввода?
Я пытаюсь получить выходные данные XML или JSON на основе ввода. Я использовал приведенный ниже код API WEB, но не смог точно определить результат.
public string Get(int id)
{
if (GlobalConfiguration.Configuration.Formatters.XmlFormatter == null)
{
GlobalConfiguration.Configuration.Formatters.Add(GlobalConfiguration.Configuration.Formatters.XmlFormatter);
}
if (GlobalConfiguration.Configuration.Formatters.JsonFormatter == null)
{
GlobalConfiguration.Configuration.Formatters.Add(GlobalConfiguration.Configuration.Formatters.JsonFormatter);
}
if (id == 1)
{
GlobalConfiguration.Configuration.Formatters.Remove(GlobalConfiguration.Configuration.Formatters.JsonFormatter);
GlobalConfiguration.Configuration.Formatters.XmlFormatter.UseXmlSerializer = true;
}
else
{
GlobalConfiguration.Configuration.Formatters.Remove(GlobalConfiguration.Configuration.Formatters.XmlFormatter);
GlobalConfiguration.Configuration.Formatters.JsonFormatter.UseDataContractJsonSerializer = true;
}
return "value";
}
Ответы
Ответ 1
Добавьте приведенный ниже код app_start
событие в файл global.asax
. В API Url добавьте строку запроса:
GlobalConfiguration.Configuration.Formatters.JsonFormatter.MediaTypeMappings.Add(
new QueryStringMapping("type", "json", new MediaTypeHeaderValue("application/json")));
GlobalConfiguration.Configuration.Formatters.XmlFormatter.MediaTypeMappings.Add(
new QueryStringMapping("type", "xml", new MediaTypeHeaderValue("application/xml")));
например:.
for xml : http://localhost:49533/api/?type=xml
for json: http://localhost:49533/api/?type=json
Ответ 2
То, что вы пытаетесь сделать, не будет работать в многопоточной среде. Вы не можете добавлять и удалять из коллекции форматировщиков по запросу. Вот лучший способ выполнить то, что вы хотите.
public HttpResponseMessage Get(int id)
{
Foo foo = new Foo();
var content = new ObjectContent<Foo>(foo,
((id == 1) ? Configuration.Formatters.XmlFormatter :
Configuration.Formatters.JsonFormatter));
return new HttpResponseMessage()
{
Content = content
};
}
Ответ 3
Посмотрел на это немного больше и нашел ваш ответ в другом сообщении:
public HttpResponseMessage Get(int id)
{
string content = "value";
if (id == 1)
{
return Request.CreateResponse<string>(HttpStatusCode.OK, content, Configuration.Formatters.JsonFormatter);
}
return Request.CreateResponse<string>(HttpStatusCode.OK, content, Configuration.Formatters.XmlFormatter);
}
Ответ 4
Он также работает, чтобы заставить принимающие заголовки. Отличный вариант, если вы не всегда возвращаете HttpResponseMessage's
. То есть
Request.Headers.Add("Accept", "text/json");
return Request.CreateResponse(HttpStatusCode.OK, yourobject);
или
Request.Headers.Add("Accept", "application/xml");
return new Rss20FeedFormatter(feed);
Ответ 5
Если ваш запрос указывает тип mime, например application/json
, тогда web api соответствующим образом отформатирует ответ.
Если вы пытаетесь отлаживать свой веб-api вручную, используйте инструмент, например Fiddler 2, чтобы указать тип.
Эта статья описывает концепцию.
Ответ 6
В то время как принятый ответ vijayjan15 кажется лучшим способом для вашей конкретной ситуации (то есть с использованием MediaTypeMappings), вы можете альтернативно иметь два разных методы, которые возвращают XML, и тот, который возвращает JSON. Для этого вы можете создать экземпляр HttpConfiguration для конкретного контроллера (чтобы не изменять его в GlobalConfiguration.Configuration):
public MyReturnType GetMyTypeAsXml() {
Configuration = new HttpConfiguration();
Configuration.Formatters.Clear();
Configuration.Formatters.Add(new XmlMediaTypeFormatter());
return new MyReturnType();
}
public MyReturnType GetMyTypeAsJson() {
Configuration = new HttpConfiguration();
Configuration.Formatters.Clear();
Configuration.Formatters.Add(new JsonMediaTypeFormatter());
return new MyReturnType();
}
Я не уверен, сколько накладных расходов приходится на создание нового экземпляра HttpConfiguration (я подозреваю, что не много), но новый экземпляр поставляется с сборкой Formatters, заполненной по умолчанию, поэтому вы должны ее очистить сразу после его создания. Обратите внимание, что если вы не используете Configuration = new HttpConfiguration() и вместо этого измените конфигурацию напрямую, она изменит свойство GlobalConfiguration.Configuration(так что это повлияет на все ваши другие методы WebApi - плохо!).
Ответ 7
QueryStringMapping является хорошим решением, но мне нужно значение по умолчанию для типа.
для xml: localhost:49533/api/?type=xml
для json: localhost:49533/api/
Я решаю такую ситуацию:
GlobalConfiguration.Configuration.Formatters.XmlFormatter.SupportedMediaTypes.Clear();
var jSettings = new JsonSerializerSettings();
GlobalConfiguration.Configuration.Formatters.JsonFormatter.SerializerSettings = jSettings;
GlobalConfiguration.Configuration.Formatters.XmlFormatter.MediaTypeMappings.Add(new QueryStringMapping("xml", "true", new MediaTypeHeaderValue("application/xml")));