ASP.NET Core Web API
1.简单介绍
ASP.NET Core Web API 是 ASP.NET Core MVC 的一个功能。ASP.NET Core MVC 包含了对 Web API 的支持。可以构建多种客户端的 HTTP 服务。ASP.NET Core Web API可用于在 .NET Core 上构建 RESTful 应用程序。
框架包含对 HTTP 内容协商的支持,内置支持以 JSON 或 XML 格式化的数据。编写自定义格式化程序已添加对自有格式的支持。
使用链接生成对超媒体的支持。启用对跨资源共享(CORS)的支持,以便 Web API 可以在多个 Web应用程序之间共享。
例如,新建一个 API 项目,默认包含一个 ValuesController:
[Route("api/[controller]")]
[ApiController]
public class ValuesController : ControllerBase
{
// GET api/values
[HttpGet]
public ActionResult<IEnumerable<string>> Get()
{
return new string[] { "value1", "value2" };
} // GET api/values/5
[HttpGet("{id}")]
public ActionResult<string> Get(int id)
{
return "value";
} // POST api/values
[HttpPost]
public void Post([FromBody] string value)
{
} // PUT api/values/5
[HttpPut("{id}")]
public void Put(int id, [FromBody] string value)
{
} // DELETE api/values/5
[HttpDelete("{id}")]
public void Delete(int id)
{
}
}
默认包含了 GET,POST,PUT,DELETE 这几个 HTTP 请求操作。这里直接使用特性路由,在控制器上注明 [Route("api/[controller]")]。调试并打开浏览器输入 https://localhost:5000/api/values ,会返回数据。
2.自定义格式化(Format)
ASP.NET Core MVC内建支持对相应数据的格式,用来修正格式或生成客户端指定的格式。
1.特定格式的操作结果
某些操作结果的类型是特定的格式,比如 JsonResult 或 ContentResult 。操作可以总是返回格式为特定格式的具体结果。比如返回 JsonResult 时将返回 JSON 格式化数据,而不管客户端要求的是什么格式。
操作并不要求返回任何特定的类型, MVC 支持任何对象作为返回值。如果操作返回的是 IActionResult 的某个实现,并且控制器继承自 Controller ,那么可以使用更多辅助方法。如果不是,则将使用合适的 IOutputFormatter 实现序列化对象。
若要从继承 Controller 基类的控制器返回特定格式的数据,可以使用内置的辅助方法 Json 来返回 JSON 格式, 使用 Content 来返回 纯文本。操作方法的返回类型必须是指定的结果类型(如 JsonResult)或 IActionResult。
[HttpGet]
public JsonResult Get()
{
return Json(new User());
}
以上代码 Content-Type 将返回 application/json。
要想返回纯文本格式的数据,则使用 ContentResult 以及 Content 辅助方法:
[HttpGet]
public ContentResult Get()
{
return Content("result");
}
以上代码 Content-Type 将返回 test/plan 。 也可以使用一个字符串相应类型来实现这个行为:
[HttpGet]
public string Get()
{
return "result";
}
对于具有多个返回类型或选项的复杂操作,请选择 IActionResult 作为返回类型。
2.配置格式化程序
如果应用程序想支持默认 JSON 之外的格式,可以在 project.json 文件中添加这些额外的依赖项,并配置 MVC 来支持。输入和输出的格式是可以隔离的。输入格式通过使用模型绑定,输出格式通过格式化响应。
3.添加对 XML 格式的支持
要添加对 XML 格式的支持,需要先安装 Microsoft.AspNetCore.Mvc.Formatters.Xml 包,然后在 ConfigureServices 中配置 XmlSerializerFormatters :
services.AddMvc()
.AddXmlSerializerFormatters()
.SetCompatibilityVersion(CompatibilityVersion.Version_2_1);
或者可以只添加输出格式:
services.AddMvc(options => {
options.OutputFormatters.Add(new XmlSerializerOutputFormatter());
})
//.AddXmlSerializerFormatters()
.SetCompatibilityVersion(CompatibilityVersion.Version_2_1);
这两种方法都将使用 System.Xml.Serialization.XmlSerializer 序列化结果。还可以通过添加其他相关格式来使用 System.Runtime.Serialization.DataContractSerializer :
services.AddMvc(options => {
options.OutputFormatters.Add(new XmlDataContractSerializerOutputFormatter());
})
//.AddXmlSerializerFormatters()
.SetCompatibilityVersion(CompatibilityVersion.Version_2_1);
4.强制特定格式化
若是想为某个操作限制响应格式,则可以使用 [Produces] 过滤器。[Produces] 过滤器可以为这个控制器或 Action 指定响应格式:
[HttpGet("{id}", Name = "Get")]
[Produces("application/json")]
public string Get(int id)
{
return "value";
}
对于一些特殊情况,可能不想使用内建的格式化实现。默认情况下,返回类型为 string 时将格式化为 text/plain 。这种行为可以通过移除 TextOutputFormatter 来改变:
public void ConfigureServices(IServiceCollection services)
{
services.AddMvc(options => {
options.OutputFormatters.RemoveType<TextOutputFormatter>();
options.OutputFormatters.RemoveType<HttpNoContentOutputFormatter>();
}).SetCompatibilityVersion(CompatibilityVersion.Version_2_1);
}
上面移除了 TextOutputFormatter 和 HttpNoContentOutputFormatter,当返回类型为 string 时,将返回 406 Not Acceptable。如果存在 XML 格式化程序,则将格式化响应结果。
移除了 HttpNoContentOutputFormatter ,当返回某个返回类型为模型对象的操作返回 null 时,将返回 204 No Content 响应。JSON 格式将简单地返回主体信息为 null 的响应,而 XML 格式将返回一个空的带有 xsi:nil="true" 属性的 XML 元素。
5.响应格式 URL 映射
客户端可以在 URL 中请求特定的格式,比如在请求字符串或路径中,或者通过使用特定格式的文件扩展名(比如 .xml 或 .json),需要在 API 所使用的路由中指定:
[FormatFilter]
public class UserController : Controller
{
// GET: api/User
[HttpGet]
[Route("[controller]/[action]/{id}.{format?}")]
public IActionResult GetById(int id)
{
return Content("xxx");
}
}
这个路由配置将允许使用可选的文件扩展名来指定格式。[FormatFilter] 特性将在 RouteData 中检查该格式的值是否存在,并创建响应时将响应数据映射到相应的格式:
Route Formatter
/User/GetById/5 :默认输出格式
/User/GetById/5.json :JSON格式(如果配置过)
/User/GetById/5.xml; :XML格式(如果配置过)
6.自定义格式化程序 Protocol Buffers (简称 protobuf)
Protocol Buffers 是一种轻便高效的结构化数据存储格式,可用于结构化数据串行化,或者说序列化。它很适合做数据存储或 RPC(远程过程调用协议)数据交换格式。可用于通讯协议,数据存储等领域的语言无关,平台无关,可扩展的序列化结构数据格式。比如实现一个程序返回 protobuf 格式:
创建 API 项目,添加 protobuf-net 引用。
添加 ProtobufFormatter 类:
public class ProtobufFormatter:OutputFormatter
{
public string ContentType { get; private set; }
public ProtobufFormatter()
{
ContentType = "application/proto";
SupportedMediaTypes.Add(MediaTypeHeaderValue.Parse("application/proto"));
} public override Task WriteResponseBodyAsync(OutputFormatterWriteContext context)
{
if (context == null)
{
throw new ArgumentNullException(nameof(context));
}
var response = context.HttpContext.Response;
Serializer.Serialize(response.Body,context.Object);
return Task.FromResult();
} }
继承 OutputFormatter ,然后实现 WriteResponseBodyAsync 方法,初始化时赋值 ContentType ,并添加支持 MediaType。在 WriteResponseBodyAsync 方法中获取 Response ,调用 protobuf-net 的 Serializer.Serialize 方法将 Object 序列化至输出内容。 protobuf 在序列化时必须指定顺序,添加 User 类,实现 protobuf 实体:
[ProtoContract]
public class User
{
[ProtoMember()]
public int Id { get; set; }
[ProtoMember()]
public string Name { get; set; }
[ProtoMember()]
public int Age { get; set; }
}
类上需要添加 [ProtoContract] 特性,字段上需要 ProtoMember 特性,并指定顺序。然后修改 UserController:
[Route("api/[controller]")]
[ApiController]
[FormatFilter]
public class UserController : Controller
{
private IEnumerable<User> users;
public UserController()
{
users = new User[] {
new User(){ Id=,Name="Bob",Age = },
new User(){ Id=,Name="Tom",Age = }
};
}
// GET: api/User
[HttpGet]
[Produces("application/proto")]
public IEnumerable<User> Get()
{
return users;
}
}
修改 ConfigureServices :
public void ConfigureServices(IServiceCollection services)
{
services.AddMvc(options => {
options.OutputFormatters.Add(new ProtobufFormatter());
}).SetCompatibilityVersion(CompatibilityVersion.Version_2_1);
}
运行程序,会返回一个二进制文件。
创建一个控制台,检查序列化:
class Program
{
static void Main(string[] args)
{
HttpClient client = new HttpClient();
var stream = client.GetStreamAsync("https://localhost:44358/api/User").Result;
var users = Serializer.Deserialize<List<User>>(stream);
foreach (var user in users)
{
Console.WriteLine($"Id:{user.Id} - Name:{user.Name} - Age:{user.Age}");
}
Console.ReadKey();
}
}
ASP.NET Core Web API的更多相关文章
- 使用 Swagger 自动生成 ASP.NET Core Web API 的文档、在线帮助测试文档(ASP.NET Core Web API 自动生成文档)
对于开发人员来说,构建一个消费应用程序时去了解各种各样的 API 是一个巨大的挑战.在你的 Web API 项目中使用 Swagger 的 .NET Core 封装 Swashbuckle 可以帮助你 ...
- 在ASP.NET Core Web API上使用Swagger提供API文档
我在开发自己的博客系统(http://daxnet.me)时,给自己的RESTful服务增加了基于Swagger的API文档功能.当设置IISExpress的默认启动路由到Swagger的API文档页 ...
- Docker容器环境下ASP.NET Core Web API应用程序的调试
本文主要介绍通过Visual Studio 2015 Tools for Docker – Preview插件,在Docker容器环境下,对ASP.NET Core Web API应用程序进行调试.在 ...
- 在docker中运行ASP.NET Core Web API应用程序
本文是一篇指导快速演练的文章,将介绍在docker中运行一个ASP.NET Core Web API应用程序的基本步骤,在介绍的过程中,也会对docker的使用进行一些简单的描述.对于.NET Cor ...
- ASP.NET Core Web API Cassandra CRUD 操作
在本文中,我们将创建一个简单的 Web API 来实现对一个 “todo” 列表的 CRUD 操作,使用 Apache Cassandra 来存储数据,在这里不会创建 UI ,Web API 的测试将 ...
- 在Mac下创建ASP.NET Core Web API
在Mac下创建ASP.NET Core Web API 这系列文章是参考了.NET Core文档和源码,可能有人要问,直接看官方的英文文档不就可以了吗,为什么还要写这些文章呢? 原因如下: 官方文档涉 ...
- ASP.NET Core Web API 开发-RESTful API实现
ASP.NET Core Web API 开发-RESTful API实现 REST 介绍: 符合REST设计风格的Web API称为RESTful API. 具象状态传输(英文:Representa ...
- Docker容器环境下ASP.NET Core Web API
Docker容器环境下ASP.NET Core Web API应用程序的调试 本文主要介绍通过Visual Studio 2015 Tools for Docker – Preview插件,在Dock ...
- docker中运行ASP.NET Core Web API
在docker中运行ASP.NET Core Web API应用程序 本文是一篇指导快速演练的文章,将介绍在docker中运行一个ASP.NET Core Web API应用程序的基本步骤,在介绍的过 ...
- 支持多个版本的ASP.NET Core Web API
基本配置及说明 版本控制有助于及时推出功能,而不会破坏现有系统. 它还可以帮助为选定的客户提供额外的功能. API版本可以通过不同的方式完成,例如在URL中添加版本或通过自定义标头和通过Accept- ...
随机推荐
- javascript之正则表达式(一)
正则表达式:定义一套规则,检查字符串的用的.换句话说,就是记录文本规则的代码.适用于进行文字匹配工具,例如:(1)测试字符串的某个模式(2)替换文本(3)根据模式匹配从字符串中提取一个子字符串.语法: ...
- SP1805 HISTOGRA - Largest Rectangle in a Histogram 题解
题目链接:https://www.luogu.org/problemnew/show/SP1805 分析: 我们可以用一个单调栈由低到高来存储它的高度,并用数组对每个高度记录一下它前面(包括它自己)一 ...
- RSA premaster secret error 错误解决
报错信息如下: Caused by: com.microsoft.sqlserver.jdbc.SQLServerException: 驱动程序无法使用安全套接字层(SSL)加密与 SQL Serve ...
- 题解 P1864 【[NOI2009]二叉查找树】
#include<cstdio> #include<string> #include<cstring> #include<iostream> #incl ...
- HashMap源码之resize
final Node<K,V>[] resize() { //创建一个Node数组用于存放table中的元素, Node<K,V>[] oldTab = table; //获取 ...
- [小米OJ] 6. 交叉队列
思路: 大概思想如下: 1. 动态规划求解,构造dp[][] 二维数组: 2. 设dp[i][j], i 为 第一个字符串的第i个字母:j 为 第二个字符串的第j个字母 3. dp[i][j] 如果 ...
- 如何简单易懂地描述REST接口编程
网上很多关于REST的介绍,看起来都是云里雾里的,就像在看论文一样,晦涩难懂, 这里有一个链接大概可以简单明了地描述:https://www.zhihu.com/question/28557115
- linux初学者-swap分区篇
linux初学者-swap分区篇 swap是虚拟内存,是在硬盘中分区一块区域,当内存占满但是又急迫需要时临时当作内存使用,使用效率低于内存.本文将对linux系统中swap分区的建立做一个简要介绍. ...
- perspective transform透视矩阵快速求法+矩形矫正
算了半天一直在思考如何快速把矩阵算出来,网上基本都是在说边长为1的正方形的变换方式=.= 不怎么用得上…… 公式推导推半天,计算还麻烦.... ++++++++++++++++++++++++++ ...
- 脱壳系列_0_FSG壳_详细版
---恢复内容开始--- 1 查看信息 使用ExeInfoPe查看此壳程序 可以看出是很老的FSG壳. 分析: Entry Point : 000000154,熟悉PE结构的知道,入口点(代码)揉进P ...