ASP.NET Core 3.1:Accept 和 Content-Type | 向 Web API 添加 XML 支持

        默认情况下,当我们在 ASP.NET Core 中创建 Web API 时,它配置为使用 JSON。这个想法是,不同技术的不同客户端可以使用 JSON 格式与我们的应用程序通信,发送和接收信息。但是,某些 API 客户端可能更喜欢使用其他格式,例如 XML。

        我们将配置一个 Web API 来支持 XML。此外,我们将讨论客户端如何以 JSON 和 XML 格式请求信息。我们将看到 Accept 和 Content-Type 标头,并讨论内容协商。

准备项目

        我们要做的第一件事是在 ASP.NET Core 3.1 中创建一个 Web API。默认情况下,我们会得到一个名为WeatherForecastController的控制器。我们可以在其中添加一个 Post 方法,该方法将接收WeatherForecast的实例。最后,该类应如下所示:

WeatherForecastController.cs:

using System;
using System.Collections.Generic;
using System.Linq;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Logging;

namespace WebAPIJSONXML.Controllers
{
    [ApiController]
    [Route("[controller]")]
    public class WeatherForecastController : ControllerBase
    {
        private static readonly string[] Summaries = new[]
        {
            "Freezing", "Bracing", "Chilly", "Cool", "Mild", "Warm", "Balmy", "Hot", "Sweltering", "Scorching"
        };

        private readonly ILogger<WeatherForecastController> _logger;

        public WeatherForecastController(ILogger<WeatherForecastController> logger)
        {
            _logger = logger;
        }

        [HttpGet]
        public IEnumerable<WeatherForecast> Get()
        {
            var rng = new Random();
            return Enumerable.Range(1, 5).Select(index => new WeatherForecast
            {
                Date = DateTime.Now.AddDays(index),
                TemperatureC = rng.Next(-20, 55),
                Summary = Summaries[rng.Next(Summaries.Length)]
            })
            .ToArray();
        }

        [HttpPost]
        public ActionResult Post(WeatherForecast forecast)
        {
            // Save the weather…

            return Ok();
        }
    }
}

        为了以 XML 格式从我们的 Web API 接收和发送数据,我们需要在 Startup 类中配置相应的服务。幸运的是,这就像调用 Startup 类中的方法一样简单。该方法称为AddXmlDataContractSerializerFormatters,我们可以按如下方式使用它:

Startup.cs:

public void ConfigureServices(IServiceCollection services)
{
     services.AddControllers().AddXmlDataContractSerializerFormatters();

接收 XML 格式的数据 – 接受

        现在我们已经创建并配置了 Web API,我们就可以以 JSON 格式从中接收数据了。如果我们运行 Web API 并使用 Postman 调用它,您很可能会获得 JSON 格式的数据。这是因为 JSON 是使用的默认格式。我们如何表明我们想要其他格式的数据?使用 Accept 标头。

根据MDN的说法:

        Accept 请求 HTTP 标头通告客户端能够理解哪些内容类型(以 MIME 类型表示)。

        这里的想法是,通过这个标头,我们可以向 Web API 指示我们想要返回给我们的数据类型,无论是 JSON (application/json)、XML (application/xml) 还是其他。application/json 和 application/xml 值是媒体类型或 MIME 类型的示例。

        在 Postman 中,我们可以使用 Headers 选项卡来指示我们想要返回给我们的媒体类型:

这样,Web API 将以 JSON 格式返回响应:

Response.json: 

[
    {
        "date": "2020-01-21T14:53:53.35732-04:00",
        "temperatureC": 21,
        "temperatureF": 69,
        "summary": "Scorching"
    },
    {
        "date": "2020-01-22T14:53:53.3573213-04:00",
        "temperatureC": 1,
        "temperatureF": 33,
        "summary": "Freezing"
    }
  …

但是,如果将Accept值更改为“application / xml”,那么我们将得到XML格式的答案: 

Response.xml: 

<ArrayOfWeatherForecast xmlns:i="http://www.w3.org/2001/XMLSchema-instance&quot; xmlns="http://schemas.datacontract.org/2004/07/WebAPIJSONXML"&gt;
    <WeatherForecast>
        <Date>2020-01-21T14:38:11.9403235-04:00</Date>
        <Summary>Mild</Summary>
        <TemperatureC>52</TemperatureC>
    </WeatherForecast>
    <WeatherForecast>
        <Date>2020-01-22T14:38:11.9403337-04:00</Date>
        <Summary>Hot</Summary>
        <TemperatureC>27</TemperatureC>
    </WeatherForecast>
    …
</ArrayOfWeatherForecast>

前面的XML结构中,不可缺少的一个部分是“xmlns=” http://schemas.datacontract.org/2004/07/WebAPIJSONXML” ;,这是表示XML结构的方式。

内容协商

        我们看到了两个示例,一个是我们请求使用 JSON 表示的资源,另一个是使用 XML 表示的资源。但是,如果我们想告诉 Web API 我们可以接受的格式列表怎么办?我们可以通过指示各种媒体类型来实现这一点。

例如:

接受:application/zip、application/xml

        在上一个案例中,我们请求两种类型的媒体:application/zip 和 application/xml。我们知道我们的应用程序不提供 application/zip,因此我们的应用程序使用下一个值。Web API 将使用它发现可以提供的第一种类型的内容。我们称之为内容协商。

内容类型

        除了我们的 Web API 能够以 XML 格式发送数据之外,我们还希望它能够以这种格式接收信息。为此,我们必须使用Content-Type标头来指示要在 POST 方法期间发送的资源的媒体类型:

然后,在 Body 选项卡中我们放置一个 XML 结构(取自从 Web API 获得的响应):

        请注意,我添加了xmlns属性来指示 XML 命名空间。如果没有此属性,您将收到错误。

        如果我们按下“发送”,我们将从 Web API 收到一个“确定”消息,表明我们可以有效地发送 XML。

        如果愿意,我们还可以向我们的 Web API 发送 JSON。

概括

  • 我们可以轻松配置我们的 Web API 以提供和接收 XML 格式的数据
  • Accept 标头用于指示我们接受作为响应的媒体类型(可以是 JSON、XML 等)
  • 内容协商是指确定给定请求的最佳内容格式的过程
  • Content-Type 标头用于指示资源的媒体类型。

如果您喜欢此文章,请收藏、点赞、评论,谢谢,祝您快乐每一天。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

hefeng_aspnet

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值