<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
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 ,會返回資料。
ASP.NET Core MVC內建支援對相應資料的格式,用來修正格式或生成使用者端指定的格式。
某些操作結果的型別是特定的格式,比如 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 作為返回型別。
如果應用程式想支援預設 JSON 之外的格式,可以在 project.json 檔案中新增這些額外的依賴項,並設定 MVC 來支援。輸入和輸出的格式是可以隔離的。輸入格式通過使用模型繫結,輸出格式通過格式化響應。
要新增對 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);
若是想為某個操作限制響應格式,則可以使用 [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 元素。
使用者端可以在 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 中檢查該格式的值是否存在,並建立響應時將響應資料對映到相應的格式:
RouteFormatter
/User/GetById/5 :預設輸出格式
/User/GetById/5.json :JSON格式(如果設定過)
/User/GetById/5.xml; :XML格式(如果設定過)
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(); } }
到此這篇關於ASP.NET Core Web API的文章就介紹到這了。希望對大家的學習有所幫助,也希望大家多多支援it145.com。
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45