最好的扁平化网站,上海网页设计,广东深圳今天最新通知,实时热点新闻事件2021什么是响应结果响应结果就是#xff0c;在客户端向服务器发出请求后#xff0c;服务器根据客户端的请求参数#xff0c;给出的结果#xff0c;这就是一个完整的响应结果过程。响应的结果包含的内容非常多#xff0c;主要的有 HTTP Status Code#xff0c;Content-Type,Co… 什么是响应结果响应结果就是在客户端向服务器发出请求后服务器根据客户端的请求参数给出的结果这就是一个完整的响应结果过程。响应的结果包含的内容非常多主要的有 HTTP Status CodeContent-Type,Content 等等在这里不再一一赘述。一般情况下在 .NET MVC 中如果是 API 接口默认使用 JsonOutputFormatter 对结果进行格式化。但是也不排除某些情况下我们需要对业务进行兼容化的设置比如部分接口使用 xml部分接口使用自定义的格式需求的响应是第一要务。常见响应结果格式化器在 .NET介于官方改名咱也不叫 Core 了哈 MVC中有几种内置的常见响应结果格式化器他们分别是0、OutputFormatter基类
1、TextOutputFormatter基类
2、StringOutputFormatter
3、StreamOutputFormatter
4、JsonOutputFormatter
5、XmlSerializerOutputFormatter
由于这几种常见的格式化器的存在我们可以放心的在 .NET MVC 中使用 请求- 响应 过程而不必关心他具体的实现。来自天气预报的示例默认的响应结果格式jsonprivate static readonly string[] Summaries new[]
{
Freezing, Bracing, Chilly, Cool, Mild, Warm, Balmy, Hot, Sweltering, Scorching
};
private IEnumerableWeatherForecast GetWeatherForecast()
{
var rng new Random();
return Enumerable.Range(1, 3).Select(index new WeatherForecast{Date DateTime.Now.AddDays(index),TemperatureC rng.Next(-20, 55),Summary Summaries[rng.Next(Summaries.Length)]}).ToArray();
}
[HttpGet]
public IEnumerableWeatherForecast Get()
{
return GetWeatherForecast();
}
当我们请求上面的 API 接口将得到下面的默认输出结果。[{
date: 2020-10-24T17:19:05.463858808:00,
temperatureC: 2,
temperatureF: 35,
summary: Cool},{
date: 2020-10-25T17:19:05.46460208:00,
temperatureC: 18,
temperatureF: 64,
summary: Sweltering},{
date: 2020-10-26T17:19:05.464605708:00,
temperatureC: -14,
temperatureF: 7,
summary: Mild}
]
这很好是我们想要的结果。Xml响应结果格式器在上面的天气预报示例中API接口默认使用了 json 格式输出响应结果。在不改动业务代码的情况下我们可以增加一种 xml 输出结果具体做法就是增加一个 API 接口然后在 startup.cs 中添加 xml 格式化器。[Produces(application/xml)]
[HttpGet(xml)]
public IEnumerableWeatherForecast Xml()
{
return GetWeatherForecast();
}
配置 Xml 格式器 XmlDataContractSerializerOutputFormatterpublic void ConfigureServices(IServiceCollection services)
{services.AddControllers(configure {configure.OutputFormatters.Add(new XmlDataContractSerializerOutputFormatter());});
}
这个时候再请求 API 地址/weatherforecast/xml 我们将会得到的结果如下ArrayOfWeatherForecast xmlns:ihttp://www.w3.org/2001/XMLSchema-instance xmlnshttp://schemas.datacontract.org/2004/07/CustomBinder
WeatherForecast
Date2020-10-24T17:24:19.104711608:00/Date
SummaryScorching/Summary
TemperatureC49/TemperatureC
/WeatherForecast
WeatherForecast
Date2020-10-25T17:24:19.104721908:00/Date
SummaryCool/Summary
TemperatureC6/TemperatureC
/WeatherForecast
WeatherForecast
Date2020-10-26T17:24:19.104722108:00/Date
SummaryFreezing/Summary
TemperatureC-20/TemperatureC
/WeatherForecast
/ArrayOfWeatherForecast
ProducesAttribute 特性(内容协定API 接口 /xml 的特性标注多了一个 [Produces(application/xml)]正是得益于 ProducesAttribute 特性我们可以在 MVC 框架内随意的定制响应结果。ProducesAttribute 和其它的特性类没有太多的区别其基本原理就是使用用户指定的 contentType 参数本例中为 application/xml) 到 OutputFormatters 中查找对应类型的 Formatters。如果找到了就使用该 Formatters 格式化响应结果如果没有找到就抛出 No output formatter was found for content types 的警告同时客户端会收到一个 406(Not Acceptable) 的响应结果。我想要更多-自定义格式化器没错上面的几种常见的格式化器虽然非常好用。但是我现在要对接一个旧的第三方客户端该客户端采用的是 url 参数请求协议包很明显由于这个客户端过于年长假装找不到维护人员只能在服务器端进行兼容了。不过也不用过于担心开发一个自定义的格式化器还是非常简单的。我们只需要定义一个继承自 TextOutputFormatter 的子类即可其中有小部分需要编写的代码。需求我们接到的需求是兼容 url 方式的请求参数响应结果经过调研确认格式如下keyvaluekeyvaluekeyvalue
需求调研清楚后编码的速度就得跟上了定义格式化器 WeatherOutputFormatterpublic class WeatherOutputFormatter : TextOutputFormatter
{
private readonly static Type WeatherForecastType typeof(WeatherForecast);
public WeatherOutputFormatter(){SupportedEncodings.Add(Encoding.UTF8);SupportedEncodings.Add(Encoding.Unicode);SupportedMediaTypes.Add(text/weather);}
public override bool CanWriteResult(OutputFormatterCanWriteContext context){
if (context null){
throw new ArgumentNullException(nameof(context));}
if (context.ObjectType WeatherForecastType || context.Object is WeatherForecast || context.ObjectType.GenericTypeArguments[0] WeatherForecastType){
return base.CanWriteResult(context);}
return false;}
private string WriterText(IEnumerableWeatherForecast weathers){StringBuilder builder new StringBuilder();
foreach (var wealther in weathers){builder.Append(WriterText(wealther));}
return builder.ToString();}
private string WriterText(WeatherForecast weather) $date{WebUtility.UrlEncode(weather.Date.ToString())}temperatureC{weather.TemperatureC}temperatureF{weather.TemperatureF}summary{WebUtility.UrlEncode(weather.Summary)};
public override async Task WriteResponseBodyAsync(OutputFormatterWriteContext context, Encoding selectedEncoding){
if (context null){
throw new ArgumentNullException(nameof(context));}
if (selectedEncoding null){
throw new ArgumentNullException(nameof(selectedEncoding));}
string text string.Empty;
if (context.ObjectType WeatherForecastType)text WriterText(context.Object as WeatherForecast);
else if (context.ObjectType.GenericTypeArguments[0] WeatherForecastType)text WriterText(context.Object as IEnumerableWeatherForecast);
if (string.IsNullOrEmpty(text)){
await Task.CompletedTask;}
var response context.HttpContext.Response;
await response.WriteAsync(text, selectedEncoding);}
}
正所谓一图胜千言所以我给大家画了一张图方便理解从图中可以看出我们只需要重写两个方法同时编写一个自定义格式化逻辑即可完成,看起来还是非常简单的。细心的同学可能发现了在 WriterText 方法中考虑到兼容性的问题我们还将 url 中的 value 进行转义可以说还是非常贴心的哈。编写测试方法[Produces(text/weather)]
[HttpGet(weather)]
public IEnumerableWeatherForecast Weather()
{
return GetWeatherForecast();
}
测试方法中定义 Produces(text/weather)指定需要的 ContentType同时还需要将 WeatherOutputFormatter 添加到 OutputFormatters 中使用。public void ConfigureServices(IServiceCollection services)
{services.AddControllers(configure {configure.OutputFormatters.Add(new XmlDataContractSerializerOutputFormatter());configure.OutputFormatters.Add(new WeatherOutputFormatter());});
}
调用接口进行测试请求 API 地址 /weather得到结果如下date2020%2F10%2F2710%3A35%3A36temperatureC42temperatureF107summaryScorchingdate2020%2F10%2F2810%3A35%3A36temperatureC28temperatureF82summaryFreezingdate2020%2F10%2F2910%3A35%3A36temperatureC17temperatureF62summarySweltering
结束语至此自定义格式化器已经完成本文通过一个简单的示例实现帮助大家理解如何在 MVC 中使用自定义格式化器文章篇幅不长做图花了点心思欢迎您的关注。示例代码托管在https://github.com/lianggx/EasyAspNetCoreDemo/tree/master/CustomBinder