默认情况下,当我们在 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" xmlns="http://schemas.datacontract.org/2004/07/WebAPIJSONXML">
<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 标头用于指示资源的媒体类型。
如果您喜欢此文章,请收藏、点赞、评论,谢谢,祝您快乐每一天。
1万+

被折叠的 条评论
为什么被折叠?



