Подтвердить что ты не робот

Как заставить 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";
}
4b9b3361

Ответ 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")));