43

我尝试根据我的输入获取输出 XML 或 JSON 数据。我使用了以下 WEB API 代码,但无法准确输出。

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";
}
4

7 回答 7

81

在文件中添加以下代码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
于 2013-11-14T13:31:36.393 回答
9

您尝试做的事情在多线程环境中不起作用。您不能基于每个请求在格式化程序集合中添加和删除。这是实现您想要的更好的方法。

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
    };
}
于 2013-11-14T12:32:27.570 回答
8

对此进行了更多研究,并在另一篇文章中找到了答案:

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);
}
于 2014-10-23T08:30:57.780 回答
6

它还可以强制接受标头。如果您不总是返回,这是一个很好的选择HttpResponseMessage's。IE

Request.Headers.Add("Accept", "text/json");
return Request.CreateResponse(HttpStatusCode.OK, yourobject);

或者

Request.Headers.Add("Accept", "application/xml");
return new Rss20FeedFormatter(feed);
于 2015-09-29T19:52:08.993 回答
5

如果您的请求指定了 mime 类型,例如application/json,则 web api 将适当地格式化响应。

如果您尝试手动调试 Web api,请使用Fiddler 2之类的工具来指定类型。

这篇文章描述了这个概念。

于 2013-11-14T13:42:19.280 回答
4

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")));
于 2014-05-13T12:25:56.117 回答
3

虽然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(),而是直接修改 Configuration,它会修改 GlobalConfiguration.Configuration 属性(因此,它会影响您的所有其他 WebApi 方法 - 糟糕!)。

于 2014-07-25T23:32:35.463 回答