【ASP.NET Core】设置Web API 响应的数据格式——Produces 特性篇
开春首文,今天老周就跟各位大伙伴们聊一个很简单的话题:怎么设定API响应的数据格式。
说本质一点,就是设置所返回内容的 MIME 类型(Content-Type 头)。当然了,咱们不会使用在HTTP管道中插入中间件的方式来解决,因为:
A、这样做会导致所有传入传出的HTTP消息都被修改;
B、这样会毁坏API应用的设计规范,弄得不伦不类、礼崩乐坏、不堪入目。
所以,今天的主角是一个特性类(Attribute),它的大名叫 ProducesAttribute,位于 Microsoft.AspNetCore.Mvc 命名空间下。这么一介绍,你肯定能找到它。
根据定义,该特性类可用于:类、方法。说得再直接一点,就是用于 Controller类 和 Action方法。
这个特性类用于 设置API返回数据的MIME类型,嗯,也就是所谓的格式了。最人性化最简单的使用方法就是这样:
[Produces("text/html")]
[Produces("audio/wav")]
[Produces("image/png")]
[Produces("application/octet-stream")]
就是这样,你希望返回的是啥东西,就用 Content-Type 字符串来指定。
马上,立刻,现在,就给大伙儿演示一个例子,让 API 返回 text/json 类型的数据。因为默认情况下,API 返回数据使用 application/json 格式,所以,咱们要改为 text/json,就得用 Produces 特性。
首先,新建一个空的 ASP.NET Core 应用项目。老周喜欢空模板,易于 DIY,可折腾性强。
然后,在 Program.cs 文件中注册与 MVC 控制器有关的服务,以及Map一下相关中间件。
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddControllers();
var app = builder.Build(); app.MapControllers(); //这一句不要忘了 app.Run();
接着,新建一个类,或者在“新建项”中选择空的 API 控制器。
[Route("api/[controller]")]
[ApiController]
public class Demo : ControllerBase
{
……
}
Route 特性指定访问这个控制器的 URL,[controller] 是个占位符,访问时用实际的控制器名来替换。比如,这里的控制器的名字是 Demo,访问时的URL就是 http://somehost/api/demo/xxxx。不过,这里老周的命名不太规范,规范的命名应该是 DemoController。只是老周嫌它的后缀太长。
其实 API 和 MVC 的控制器实现起来一样,但 API 没有视图,所以类继承时,基类可以用 ControllerBase 类而不是 Controller 类。另外,在类上面加一个 ApiController 特性,表明这个 Demo 类是作为 API 控制器用的,并且它的派生类都作为 API 控制器。
好,我们先实现两个 Action。
[Route("getbt")]
[HttpGet]
public string GetWTF() => "What the bitch"; [Route("getak")]
[HttpGet]
public IDictionary<string, int> GetAK()
{
// 返回一个类实例和返回字典对象
// 其JSON结构差不多
// 此处为了简单,直接用字典
return new Dictionary<string, int>
{
["item1"] = 10,
["item2"] = 49
};
}
Action 方法上指定的 Route 是相对于控制器类的 Route 的,即 /api/demo/getbt、/api/demo/getak。
这个相信各位看得懂,不用过多解释,看不懂的肯定是因为你太谦虚了。
运行一下这个示例,直接通过浏览器的开发人员工具查看,得知:
第一个 action 返回的 string 类型,因此默认选用 text/plain 格式(普通文本)。
第二个 action 返回的是字典对象,默认选择 application/json 格式。
现在,把 Produces 特性用上,使其返回的数据变为 text/json 格式。
[Route("api/[controller]")]
[ApiController]
[Produces("text/json")]
public class Demo : ControllerBase
{
……
}
再次运行,从浏览器的开发人员工具中查看HTTP消息。
不过,你得小心!如果你指定的格式与 API 所返回的对象无法兼容,就会崩盘。比如,把上面的 getak 改成这样:
[Route("getak")]
[HttpGet]
[Produces("text/plain")]
public IDictionary<string, int> GetAK()
{
……
}
虽然 Demo 控制器类上应用了 Produces 特性指定了 text/json 格式,但这个方法上也应用了此特性,依据就近原则,程序会优先选用 text/plain 格式。在内部的处理机制中,这是不匹配的,除非方法的返回值类型是 string。
一旦执行,就会得到错误状态码。
下面演示一个返回 jpg 图像格式(即 image/jpeg)的例子。在刚才的 Demo 控制器类上增加一个方法,名为 GetImage。
[Route("getpic")]
[HttpGet]
[Produces("image/jpeg")]
public Stream GetImage()
{
// 因为应用程序目录和内容目录相同
// 所以直接获取Current即可
string dirpath = Directory.GetCurrentDirectory();
// 直接返回文件流
return System.IO.File.OpenRead(Path.Combine(dirpath, "505.jpg"));
}
方法的返回类型为 Stream 对象,套用 image/jpeg 格式是没问题的,毕竟图像是以二进制的方式响应的。
老周事先从网上找了一张图片,命名为 505.jpg,放在项目根目录下。你在测试时可以随便找个图片,或者拍一张妹子的照片(前提是妹子不会报警),放到项目目录下即可,文件名自己改。
在浏览器中访问后得到结果如下图所示。
--------------------------------------------------- 异次元分界线 -----------------------------------------------------------
既然数据可以以 JSON 格式返回,那能不能返回 XML 格式呢?当然是可以的。
public class 帅哥
{
public string Name { get; set; }
public int Age { get; set; }
public decimal Weight { get; set; }
}
-----------------------------------------------------------
[Route("getxml")]
[HttpGet]
[Produces("application/xml")]
public 帅哥 GetXML()
{
return new 帅哥
{
Name = "老周",
Age = 93,
Weight = 203.77M
};
}
先是定义了一个新类,叫“帅哥”,接着,GetXML 方法返回一个“帅哥”类型的实例。注意此方法应用了 Produces 特性,指定返回的数据格式为 application/xml。
Web API 控制器默认是不启用 XML 输出支持的,所以在 Program.cs 文件中,在注册MVC功能到服务容器时,需要手动开启对XML输出的支持。
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddControllers().AddXmlSerializerFormatters();
var app = builder.Build(); ……
这样一来,访问 /api/demo/getxml 就能得到 XML 数据了。
好了,今天的文章就水到这里了,下一篇咱们聊聊 FormatFilter 特性类。
【ASP.NET Core】设置Web API 响应的数据格式——Produces 特性篇的更多相关文章
- angular4和asp.net core 2 web api
angular4和asp.net core 2 web api 这是一篇学习笔记. angular 5 正式版都快出了, 不过主要是性能升级. 我认为angular 4还是很适合企业的, 就像.net ...
- 温故知新,使用ASP.NET Core创建Web API,永远第一次
ASP.NET Core简介 ASP.NET Core是一个跨平台的高性能开源框架,用于生成启用云且连接Internet的新式应用. 使用ASP.NET Core,您可以: 生成Web应用和服务.物联 ...
- 【ASP.NET Core】设置 Web API 响应数据的格式——FormatFilter特性篇
在上一篇烂文中老周已向各位介绍过 Produces 特性的使用,本文老周将介绍另一个特性类:FormatFilterAttribute. 这个特性算得上是筛选器的马甲,除了从 Attribute 类派 ...
- 使用angular4和asp.net core 2 web api做个练习项目(一)
这是一篇学习笔记. angular 5 正式版都快出了, 不过主要是性能升级. 我认为angular 4还是很适合企业的, 就像.net一样. 我用的是windows 10 安装工具: git for ...
- 使用angular4和asp.net core 2 web api做个练习项目(四)
第一部分: http://www.cnblogs.com/cgzl/p/7755801.html 第二部分: http://www.cnblogs.com/cgzl/p/7763397.html 第三 ...
- 基于ASP.NET Core 创建 Web API
使用 Visual Studio 创建项目. 文件->新建->项目,选择创建 ASP.NET Core Web 应用程序. 基于 ASP.NET Core 2.0 ,选择API,身份验证选 ...
- ASP.NET Core Restful Web API 相关资源索引
GraphQL 使用ASP.NET Core开发GraphQL服务器 -- 预备知识(上) 使用ASP.NET Core开发GraphQL服务器 -- 预备知识(下) [视频] 使用ASP.NET C ...
- 使用angular4和asp.net core 2 web api做个练习项目(二), 这部分都是angular
上一篇: http://www.cnblogs.com/cgzl/p/7755801.html 完成client.service.ts: import { Injectable } from '@an ...
- 使用 ASP.NET Core 创建 Web API及链接sqlserver数据库
创建 Web API https://docs.microsoft.com/zh-cn/aspnet/core/tutorials/first-web-api?view=aspnetcore-3.0& ...
随机推荐
- 【剑指Offer】52. 两个链表的第一个公共节点 解题报告(Python)
作者: 负雪明烛 id: fuxuemingzhu 个人博客:http://fuxuemingzhu.cn/ 目录 题目描述 解题方法 方法一:栈 方法二:HashSet 方法三:不使用额外空间 日期 ...
- 使用AVPlayer自定义支持全屏的播放器(五)—Swift重构版本
前言 很早之前开源了一个简单的视频播放器,由于年久失修,效果惨目忍睹,最近特意花时间对其进行了深度重构.旧版本后期不再维护,新版本使用Swift实现,后续会增加更多功能.不想看文字的请自行下载代码-- ...
- 第十九个知识点:Shamir密钥交换场景
第十九个知识点:Shamir密钥交换场景 Shamir密钥交换场景是一个被Adi Shamir提出的算法.算法允许多方分割一个密码,例如一个密钥.当足够多的秘密结合起来,整个密钥就被计算出来了. 正式 ...
- Exploring Architectural Ingredients of Adversarially Robust Deep Neural Networks
目录 概 主要内容 深度 宽度 代码 Huang H., Wang Y., Erfani S., Gu Q., Bailey J. and Ma X. Exploring architectural ...
- Linux 离奇磁盘爆满解决办法
问题原因&通用解决步骤 频繁收到es数据节点磁盘使用监控告警,到es上查看,磁盘使用率40%,因此登录该告警服务器,df -h 查看,如图 发下根目录使用超过了80%,因此持续告警,按照以往办 ...
- Spring练习,定义三个模块,使用<import>标签完成分模块配置开发,模拟实现学生借书和还书的过程,将结束输出到控制台。
相关 知识 >>> 相关 练习 >>> 实现要求: 在图书管理系统中,学生管理模块.书籍管理模块和借还书管理模块等其他模块,相互配合协作,促使系统的运行流畅.定义三 ...
- Eclipse中英文对照表(整理笔记)
Eclipse百度界面中英文对照 目录 Eclipse百度界面中英文对照 0.菜单栏 1.File 文件菜单 2.Edit 编辑菜单 3.Source 源代码 4.Refactor 重构 5.Navi ...
- 【计项02组01号】Java版图形界面计算器
Java版图形界面计算器1.0版本 项目分析[1.0] 组成部分 代码结构 (1)窗口的创建 在<JDK 核心 API>中我们提到,创建一个窗口需要使用 JFrame 类.在本实验中,我们 ...
- [Docker] 制作并运行 Nginx 镜像
环境 操作系统(cat /etc/redhat-release):CentOS Linux release 7.6.1810 (Core) Docker:18.09.6 文件 Dockerfile F ...
- CentOS7防火墙firewalld 和 CentOS6防火墙iptables的一些配置命令
CentOS7 防火墙 一.防火墙的开启.关闭.禁用.查看状态命令 (1)启动防火墙:systemctl start firewalld (2)关闭防火墙:systemctl stop firewal ...