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的更多相关文章

  1. 使用 Swagger 自动生成 ASP.NET Core Web API 的文档、在线帮助测试文档(ASP.NET Core Web API 自动生成文档)

    对于开发人员来说,构建一个消费应用程序时去了解各种各样的 API 是一个巨大的挑战.在你的 Web API 项目中使用 Swagger 的 .NET Core 封装 Swashbuckle 可以帮助你 ...

  2. 在ASP.NET Core Web API上使用Swagger提供API文档

    我在开发自己的博客系统(http://daxnet.me)时,给自己的RESTful服务增加了基于Swagger的API文档功能.当设置IISExpress的默认启动路由到Swagger的API文档页 ...

  3. Docker容器环境下ASP.NET Core Web API应用程序的调试

    本文主要介绍通过Visual Studio 2015 Tools for Docker – Preview插件,在Docker容器环境下,对ASP.NET Core Web API应用程序进行调试.在 ...

  4. 在docker中运行ASP.NET Core Web API应用程序

    本文是一篇指导快速演练的文章,将介绍在docker中运行一个ASP.NET Core Web API应用程序的基本步骤,在介绍的过程中,也会对docker的使用进行一些简单的描述.对于.NET Cor ...

  5. ASP.NET Core Web API Cassandra CRUD 操作

    在本文中,我们将创建一个简单的 Web API 来实现对一个 “todo” 列表的 CRUD 操作,使用 Apache Cassandra 来存储数据,在这里不会创建 UI ,Web API 的测试将 ...

  6. 在Mac下创建ASP.NET Core Web API

    在Mac下创建ASP.NET Core Web API 这系列文章是参考了.NET Core文档和源码,可能有人要问,直接看官方的英文文档不就可以了吗,为什么还要写这些文章呢? 原因如下: 官方文档涉 ...

  7. ASP.NET Core Web API 开发-RESTful API实现

    ASP.NET Core Web API 开发-RESTful API实现 REST 介绍: 符合REST设计风格的Web API称为RESTful API. 具象状态传输(英文:Representa ...

  8. Docker容器环境下ASP.NET Core Web API

    Docker容器环境下ASP.NET Core Web API应用程序的调试 本文主要介绍通过Visual Studio 2015 Tools for Docker – Preview插件,在Dock ...

  9. docker中运行ASP.NET Core Web API

    在docker中运行ASP.NET Core Web API应用程序 本文是一篇指导快速演练的文章,将介绍在docker中运行一个ASP.NET Core Web API应用程序的基本步骤,在介绍的过 ...

  10. 支持多个版本的ASP.NET Core Web API

    基本配置及说明 版本控制有助于及时推出功能,而不会破坏现有系统. 它还可以帮助为选定的客户提供额外的功能. API版本可以通过不同的方式完成,例如在URL中添加版本或通过自定义标头和通过Accept- ...

随机推荐

  1. javascript之正则表达式(一)

    正则表达式:定义一套规则,检查字符串的用的.换句话说,就是记录文本规则的代码.适用于进行文字匹配工具,例如:(1)测试字符串的某个模式(2)替换文本(3)根据模式匹配从字符串中提取一个子字符串.语法: ...

  2. SP1805 HISTOGRA - Largest Rectangle in a Histogram 题解

    题目链接:https://www.luogu.org/problemnew/show/SP1805 分析: 我们可以用一个单调栈由低到高来存储它的高度,并用数组对每个高度记录一下它前面(包括它自己)一 ...

  3. RSA premaster secret error 错误解决

    报错信息如下: Caused by: com.microsoft.sqlserver.jdbc.SQLServerException: 驱动程序无法使用安全套接字层(SSL)加密与 SQL Serve ...

  4. 题解 P1864 【[NOI2009]二叉查找树】

    #include<cstdio> #include<string> #include<cstring> #include<iostream> #incl ...

  5. HashMap源码之resize

    final Node<K,V>[] resize() { //创建一个Node数组用于存放table中的元素, Node<K,V>[] oldTab = table; //获取 ...

  6. [小米OJ] 6. 交叉队列

    思路: 大概思想如下: 1. 动态规划求解,构造dp[][] 二维数组: 2. 设dp[i][j], i 为 第一个字符串的第i个字母:j 为 第二个字符串的第j个字母  3. dp[i][j] 如果 ...

  7. 如何简单易懂地描述REST接口编程

    网上很多关于REST的介绍,看起来都是云里雾里的,就像在看论文一样,晦涩难懂, 这里有一个链接大概可以简单明了地描述:https://www.zhihu.com/question/28557115

  8. linux初学者-swap分区篇

    linux初学者-swap分区篇 swap是虚拟内存,是在硬盘中分区一块区域,当内存占满但是又急迫需要时临时当作内存使用,使用效率低于内存.本文将对linux系统中swap分区的建立做一个简要介绍. ...

  9. perspective transform透视矩阵快速求法+矩形矫正

    算了半天一直在思考如何快速把矩阵算出来,网上基本都是在说边长为1的正方形的变换方式=.=   不怎么用得上…… 公式推导推半天,计算还麻烦.... ++++++++++++++++++++++++++ ...

  10. 脱壳系列_0_FSG壳_详细版

    ---恢复内容开始--- 1 查看信息 使用ExeInfoPe查看此壳程序 可以看出是很老的FSG壳. 分析: Entry Point : 000000154,熟悉PE结构的知道,入口点(代码)揉进P ...