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(0);}}

  继承 OutputFormatter ,然后实现 WriteResponseBodyAsync 方法,初始化时赋值 ContentType ,并添加支持 MediaType。在 WriteResponseBodyAsync 方法中获取 Response ,调用 protobuf-net 的 Serializer.Serialize 方法将 Object 序列化至输出内容。 protobuf 在序列化时必须指定顺序,添加 User 类,实现 protobuf 实体:

    [ProtoContract]public class User{[ProtoMember(1)]public int Id { get; set; }[ProtoMember(2)]public string Name { get; set; }[ProtoMember(3)]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=1,Name="Bob",Age = 20},new User(){ Id=2,Name="Tom",Age = 22}};}// 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();}}

 

 

  

 

转载于:https://www.cnblogs.com/afei-24/p/11391317.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/349623.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

win8配置_《FIFA 20》PC配置公布 最低仅需i3+GTX660

EA公布了新作《FIFA 20》的PC配置需求&#xff0c;玩家最低仅需 i3-2100 GTX 660 显卡即可进行游戏&#xff0c;推荐配置则为 i3-6300T GTX 670 显卡&#xff0c;考虑到本作的逼真画面效果&#xff0c;这配置可以说是非常亲民&#xff0c;另外硬盘空间需要大约 50 GB。最低配…

Thymeleaf + Spring中的验证

总览 我们将要讨论的重要主题涉及空值&#xff0c;空字符串和输入验证&#xff0c;因此我们不会在数据库中输入无效数据。 在处理空值时&#xff0c;我们使用了Java 1.8中引入的java.util.Optional 。 0 – Spring Boot Thymeleaf示例表单验证应用程序 我们正在为一所大学构…

技术管理规划-设定团队的职能

背景 职责 团队是干什么的 初步自查团队 1.公司为什么给我团队&#xff1f;希望我产出什么&#xff1f;完成对除了c端健康领域探索的研发任务&#xff0c;产出技术类产品 2.团队存在的独特价值是什么&#xff1f;研发过lx健康这款基础app,研发能力强&#xff0c;熟悉硬件相关技…

开发转测试没人要_前端开发,测试,后端,该如何选择?

一般来说前端会比后端简单一些的&#xff0c;初学者或者转行可能考虑前端多一点&#xff0c;但是后端开发的薪水又比前端高一些&#xff0c;就是比较枯燥。前端开发我目前一直在自学前端&#xff0c;从网上找资料&#xff0c;然后听课&#xff0c;只要是对编程有兴趣&#xff0…

技术管理规划-如何设定团队的目标

团队管理规划有4个互相关联的要素&#xff1a; 职能目标团队路径在未来的3个月&#xff0c;6个月&#xff0c;1年&#xff0c;2年&#xff0c;3年&#xff0c;5年中&#xff0c;你希望带着你的团队抵达一个什么样的目的地&#xff0c;也就是团队的目标。 更加清楚目标意味着什么…

a8处理器相当于骁龙几_天玑820相当于骁龙什么处理器?天梯图秒懂联发科天玑820性能排名...

5月18日&#xff0c;联发科发布了全新 天玑820处理器&#xff0c;号称目前最强中端芯&#xff0c;受到不少网友关注。联发科近年来在手机CPU市场沉寂多年&#xff0c;今年异常给力&#xff0c;先后发布了天玑1000/L、天玑800等多款处理器&#xff0c;采用了全新的命名方式&…

hibernate 继承_Hibernate继承:每个类层次结构的表

hibernate 继承在本教程中&#xff0c;我们将了解如何在hibernate中实现继承。可以通过3种方式在hibernate中实现继承。在本文中&#xff0c;我们将看到其中一种&#xff0c;即每个类层次结构一个表。 Hibernate中的继承&#xff1a; Java是面向对象的语言&#xff0c;继承是J…

vue - cli 脚手架安装

一、 node安装 1&#xff09;如果不确定自己是否安装了node,可以在命令行工具内执行&#xff1a; node -v &#xff08;检查一下 版本&#xff09;&#xff1b; 2&#xff09;如果 执行结果显示&#xff1a; xx 不是内部命令&#xff0c;说明你还没有安装node , node 安装地址…

python人工智能_人工智能福利丨Python核心语法实战

Python已正式跻身成熟语言行列&#xff0c;成为整个互联网的基础性语言之一&#xff0c;并以肉眼可见的速度&#xff0c;在全球攻城略地&#xff1a;——牢牢占据TIOBE世界编程语言排行榜第四名&#xff0c;且保持上升趋势——国家级人工智能四大平台确立——正式纳入全国计算机…

.NET Core 单元测试

应用程序测试的类型很多&#xff0c;包括集成测试&#xff0c;Web 测试&#xff0c;负载测试等。在最底层的是单元测试&#xff0c;此测试可以测试单个软件组件或方法。单元测试一般只测试开发人员的代码&#xff0c;不应该测试基础结构普、问题&#xff0c;如数据库&#xff0…

是什么原因导致OutOfMemoryError?

发生以下情况之一时&#xff0c;可能会引发OutOfMemoryError &#xff1a; JVM耗尽了本机内存 Java堆内存不足 PermGen或Metaspace内存不足 JVM花太多时间试图收集垃圾 通常可以从错误消息中OutOfMemoryError出OutOfMemoryError的根本原因。 让我们研究每种情况的细节。 …

win10电脑开机密码忘了怎么办_Mac电脑忘记开机密码怎么办?Mac开机密码快速恢复方法...

Mac忘记开机密码怎么办&#xff1f;虽然小编觉得大多数人应该都不会Mac忘记开机密码&#xff0c;但是如果真的有人忘记了怎么办呢&#xff1f;小编这里教你们一种方法&#xff0c;可以帮你1分钟快速恢复Mac电脑忘记开机密码&#xff0c;感兴趣的朋友快跟着小编一起来看看吧&…

技术管理规划-如何规划团队的架构

管理规划的4个要素 1.职能【清楚自己团队的基本职责和使命】 2.目标【为团队设定清晰的目标】 3.团队【团队的架构规划】 4.路径 团队目标 根据团队目标去梳理团队 团队目标&#xff1a; 某个时间节点&#xff0c;团队发展成什么状态。 要点说明规模实际人数和预算人数分工团队…

win10家庭版调出组策略_利用powershell为win10家庭版安装组策略

虽然win10家庭版阉割了组策略管理器&#xff0c;但至少到1607版本时还可以用cmd脚本安装它。可是随后win10更新了几个大版本&#xff0c;不知为何&#xff0c;cmd控制台常常会有诡异的Bug&#xff0c;导致无法用老办法安装组策略管理器。为了彻底解决这个问题&#xff0c;不妨另…

Spring批处理CSV处理

总览 我们将讨论的主题包括使用Spring Batch进行批处理的基本概念&#xff0c;以及如何将数据从CSV导入数据库。 0 – Spring Batch CSV处理示例应用程序 我们正在构建一个应用程序&#xff0c;该应用程序演示Spring Batch处理CSV文件的基础。 我们的演示应用程序将允许我们处…

NOIP模拟测试28「阴阳·虎·山洞」

写这几个题解我觉得我就像在按照官方题解抄一样 阴阳 题解 将题目中给的阴阳看作黑色和白色 首先我们观察到最后生成图中某种颜色必须是竖着单调递增或竖着单调递减 类似这样 否则不满足这个条件 但合法染色方案必须满足任意两个同颜色格子之间的格子也必须是该颜色。 然后我们…

linux设置环境变量_什么是linux环境变量

本来这篇文章好几天之前就写好了&#xff0c;但是媳妇儿跟我说工作日就不要发了&#xff0c;大家都在上班&#xff0c;哪有闲心思看你的文章。哎&#xff0c;可能大家用头条都是在放松刷娱乐&#xff0c;看小姐姐。所以就一直拖到现在。周末了&#xff0c;更是放松的好时候&…

理科卷math·english·chinese·biology·chemistry·physics

一套比一套炸,果然我只会做B卷,虽然我B也很差但没差到这种地步 $math$ 题解 看似没法做但总会有突破口 $70\%$ 发现和小凯的诱惑很像,于是看$gcd$是否为$1$只要为$1$可以凑齐所有数 $n^2$枚举两两$gcd$ $80\%$ 我考试时思路 找到每一个数和$mod$的$gcd$,发现只要是任一$gcd$倍数…

cad卸载_怎么把CAD卸载干净,老司机来教你

CAD经常出现文件丢失啊、这样那样的提示&#xff0c;要是身边有个大神级朋友还好&#xff0c;没有的小盆友只能乖乖的卸载&#xff0c;重新安装了&#xff0c;那么又有个问题拦住我们了——怎么把CAD卸载干净呢&#xff1f;由于卸载不干净&#xff0c;再次安装CAD时&#xff0c…

什么是JavaServer Faces(JSF)–(第2部分)

Facelets声明语言 在第1部分中&#xff0c;我介绍了JavaServer Pages&#xff08;JSF&#xff09;背后的基本思想 。 在本文中&#xff0c;我想介绍Facelets声明语言 。 HTML标签 我们遇到的第一个标签是代表HTML元素HTML标签。 这些实际上只是HTML标记&#xff08;例如输入&a…