iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > ASP.NET >.NETCoreAPI之格式化输出对象OutputFormatter
  • 342
分享到

.NETCoreAPI之格式化输出对象OutputFormatter

2024-04-02 19:04:59 342人浏览 泡泡鱼
摘要

相信大家在项目中都用过统一响应参数模板。 先声明一个响应模板类: public class ResponseDto { public int code { get; set;

相信大家在项目中都用过统一响应参数模板。

先声明一个响应模板类:

public class ResponseDto
{
    public int code { get; set; }
    public string msg { get; set; }
    public object data { get; set; }
}

再定义返回成功和失败的方法:

public IActionResult Success(object data)
{
	return ......
}
public IActionResult Fail(string msg)
{
	return ......
}

在接口返回时统一调用:

[HttpGet]
public IActionResult Get()
{
	var data = new WeatherForecast() { Date = DateTime.Now };
	return Success(data);
}

当然了,这篇文章所讲的OutputFORMatter和上面的统一模板不冲突哈,存在共通之处,都是格式化响应参数嘛,拿来做个引子。

OutputFormatter

OutputFormatter是所有格式化输出的基类,有唯一的子类:TextOutputFormatter,同时TextOutputFormatter又有一大堆子类:

  • JSONOutputFormatter
  • NewtonsoftjsonOutputFormatter
  • StrinGoutputFormatter
  • SystemTextJsonOutputFormatter
  • XmlDataContractSerializerOutputFormatter
  • XmlSerializerOutputFormatter

如果不配置任何响应参数输出格式,ASP.net core api响应参数默认的输出格式就是json

猴:这个接口给我返回xml,我不要json

我:你是不是脑子有毛病?好好的json不用用xml

得,前端大佬得要求还是得满足不是,这时候有些同学是不是已经去百度:.net怎么将对象转换成xml?

No No No,这时候就轮到OutputFormatter的孙子 XmlDataContractSerializerOutputFormatter 出场了。

只需要简单给接口配置一个属性就搞定啦。

[Produces("application/xml")]
[HttpGet]
public WeatherForecast Get()
{
	return new WeatherForecast() { Date = DateTime.Now };
}

我们来运行看一看:

wtf,怎么会406

406:表示客户端无法解析服务端返回的内容。说白了就是后台的返回结果前台无法解析就报406错误。

哦,原来是忘了在Startup中配置我们的孙子XmlDataContractSerializerOutputFormatter

services.AddControllers((c) =>
{
	c.OutputFormatters.Add(new XmlDataContractSerializerOutputFormatter());
});

注意:不只是没有在Startup中会出现406哦,以下情况也会出现:

  • contentType不存在
  • contentType与响应参数不匹配

OutputFormatter扩展

上面介绍了内置OutputFormatter的使用,那如果我们想自定义呢?当然也是可以的。

下面我们就用自定义的OutputFormatter实现顶部响应模板的效果:

public class ObjectOutputFormatter : TextOutputFormatter
{
	public ObjectOutputFormatter()
	{
		SupportedEncodings.Add(Encoding.UTF8);
		SupportedEncodings.Add(Encoding.Unicode);
		// 这就是我们自定义contentType的名称
		SupportedMediaTypes.Add("text/object");
	}

	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 = JsonConvert.SerializeObject(new ResponseDto()
		{
			msg = "成功,自定义的哦",
			code = 200,
			data = context.Object
		});
		var response = context.HttpContext.Response;
		await response.WriteAsync(text, selectedEncoding);
	}
}

[Produces("text/object")]
[HttpGet]
public WeatherForecast Get()
{
	return new WeatherForecast() { Date = DateTime.Now };
}

public void ConfigureServices(IServiceCollection services)
{
	services.AddControllers((c) =>
	{
		c.OutputFormatters.Add(new XmlDataContractSerializerOutputFormatter());
		// 我们自定义的输出格式
		c.OutputFormatters.Add(new ObjectOutputFormatter());
	});
}

搞定,我们来看看效果:

ActionFilterAttribute

有些同学可能会想到过滤器,是的,上面的效果过滤器也能实现:

public class ResultFilter : ActionFilterAttribute
{
    public override void OnResultExecuting(ResultExecutinGContext context)
    {
        ResponseDto result = new ResponseDto();
        result.code = 200;
        result.msg = "成功,ResultFilter";
        var properties = context.Result.GetType().GetProperties(BindingFlags.Instance | BindingFlags.Public);
        result.data = properties.FirstOrDefault(c => c.Name == "Value").GetValue(context.Result);
        context.Result = new JsonResult(result);
        base.OnResultExecuting(context);
    }
}

[TypeFilter(typeof(ResultFilter))]
[HttpGet]
public WeatherForecast Get()
{
	return new WeatherForecast() { Date = DateTime.Now };
}

猴:有了过滤器为什么还搞个OutputFormatter呢?

我:不能因为过滤器可以实现同样的功能就认为OutputFormatter多余了,很显然过滤器的操作对象是请求/响应上下文,而OutputFormatter的操作对象则是响应参数。再说了,ActionFilterAttribute过滤器只是众多过滤器的一种。

猴:那过滤器和自定义OutputFormatter一起用会是什么效果呢?是不是像下面这样?

我:不是,过滤器和自定义OutputFormatter同时使用,生效的只有过滤器,不信可以打断点试一下哦。

[Produces("text/object")]
[TypeFilter(typeof(ResultFilter))]
[HttpGet]
public WeatherForecast Get()
{
	return new WeatherForecast() { Date = DateTime.Now };
}

到此这篇关于.net core API之格式化输出对象OutputFormatter的文章就介绍到这了。希望对大家的学习有所帮助,也希望大家多多支持编程网。

--结束END--

本文标题: .NETCoreAPI之格式化输出对象OutputFormatter

本文链接: https://www.lsjlt.com/news/147047.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • .NETCoreAPI之格式化输出对象OutputFormatter
    相信大家在项目中都用过统一响应参数模板。 先声明一个响应模板类: public class ResponseDto { public int code { get; set;...
    99+
    2024-04-02
  • .NET Core API格式化输出对象OutputFormatter怎么用
    这篇“.NET Core API格式化输出对象OutputFormatter怎么用”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,...
    99+
    2023-06-30
  • 格式化输出
    目录 占位符(掌握) format格式化(了解) f-String格式化(掌握) 程序中经常会有这样场景:要求用户输入信...
    99+
    2023-01-31
  • python3 format格式化输出
    使用 format 方法,可以很方便的对字符串进行格式化输出 1. 使用参数位置格式 'my name is {0}, {0} age is {1}'.format('wang',10) >>> 'my name is ...
    99+
    2023-01-31
    format
  • pythn print格式化输出----
    pythn print格式化输出。   %r 用来做 debug 比较好,因为它会显示变量的原始数据(raw data),而其它的符号则是用来向用户显示输出的。   1. 打印字符串 print ("His name is %s"%("A...
    99+
    2023-01-30
    pythn print
  • Python格式化输出之format用法详解
    目录format用法一、填充1.无参(1)2.无参(2)3.无参(3)4.key value5.列表6.字典7.类8.魔法参数二、数字格式化三、叹号用法总结format用法 &nbs...
    99+
    2024-04-02
  • C++的输入与输出和格式化输出
    目录一、C++ 输入与输出 格式化输出1.cin与cout2.格式化输出2.1设置域宽及位数2.2按进制输出2.3设置填充符总结一、C++ 输入与输出 格式化输出 1.cin与cou...
    99+
    2024-04-02
  • mybatis输出SQL格式化方式
    目录mybatis输出SQL格式化自定义拦截器配置拦截器配置日志级别mybatis sql语句格式化 trim prefix suffix1. select语句2. ins...
    99+
    2024-04-02
  • Python格式化输出详情
    目录1.%格式化1.1简单格式化,不使用可选参数1.2 复杂格式化,使用可选参数1.2.1参数 (name),用于选择指定的key1.2.2参数flags和width,对齐方式和宽度...
    99+
    2024-04-02
  • Python学习 :格式化输出
    方式一:使用占位符 %   常用占位符:% s   (s = string 字符串)          % d   (d = digit 整数(十进制))        %  f   ( f = float  浮点数)   name =...
    99+
    2023-01-30
    Python
  • Python【3】:格式化 输出 whi
    (占位符) % (求余数) 示例 name = input("请输入你的名字") age =int(input("请输入你的年龄")) ...
    99+
    2023-01-31
    Python whi
  • Pythonformat()格式化输出方法
    自 Python 2.6 版本开始,字符串类型(str)提供了 format() 方法对字符串进行格式化,本节就来学习此方法。 format() 方法的语法格式如下: str....
    99+
    2024-04-02
  • Python格式化输出总结
    格式化输出一,使用%占位符name = input("请输入您的姓名") age = int(input("请输入您的年龄")) job = input("请输入您的工作") hobby = input("请输入您的爱好") msg = '...
    99+
    2023-01-31
    Python
  • python如何对变量进行格式化输出
    本篇内容主要讲解“python如何对变量进行格式化输出”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“python如何对变量进行格式化输出”吧!说明若要在输出文字信息的同时,共同输出数据,则需要使...
    99+
    2023-06-20
  • C语言之格式化屏幕输出详解
    目录题目1:请打印输出以下图案。题目2:分别按如下三种形式,编程输出九九乘法表。总结 在一些问题中,问题经常规定了屏幕输出的格式,让我们以固定的格式编程输出某些图案或表格。我们分别以...
    99+
    2024-04-02
  • C++ stringstream格式化输出输入分析
    这篇文章主要讲解了“C++ stringstream格式化输出输入分析”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“C++ stringstream格式化输出输入分析”吧!目录最近在笔试时经...
    99+
    2023-06-25
  • C++ stringstream格式化输出输入详情
    目录最近在笔试时经常遇见各种输入问题,于是细心总结一波;首先string str; cin>>str;遇到空格结束;于是乎产生了getline(),可与得到一行字符串;空...
    99+
    2024-04-02
  • python格式化输出%s与format()的用法对比
    目录1、python格式化输出历史起源2、为什么要学习python3支持的新式格式化输出呢?3、基本用法format()支持位置格式化填充,%s不支持;4、填充和对齐1)填充(只能用...
    99+
    2024-04-02
  • python中如何格式化输出
    这篇文章将为大家详细讲解有关python中如何格式化输出,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。前言:有几种方法可以显示程序的输出。 数据可以以人类可读的形式打印,或写入文件以供将来使用,甚至可以以...
    99+
    2023-06-29
  • python字符串格式化输出
    python中有两种格式化输出字符串的方式:格式化表达式、format()方法。当然,还有一个简化操作的内置format()函数。 它们绝大部分功能都是重复的,熟悉printf的可以考虑使用格式化表达式,否则使用format()更友好些,...
    99+
    2023-01-30
    字符串 python
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作