运用 ASP.NET Core MVC 建立 Web API——相应数据的内容协商(七)

2019年7月1日13:00:00运用 ASP.NET Core MVC 建立 Web API——相应数据的内容协商(七)已关闭评论 296

运用 ASP.NET Core MVC 建立 Web API

运用 ASP.NET Core MVC 建立 Web API(一)

运用 ASP.NET Core MVC 建立 Web API(二)

 运用 ASP.NET Core MVC 建立 Web API(三)

运用 ASP.NET Core MVC 建立 Web API(四)

运用 ASP.NET Core MVC 建立 Web API(五)

运用 ASP.NET Core MVC 建立 Web API(六)

 

     ASP.NET Core MVC 包罗对经由历程流动花样或依据客户端范例来设置响应数据花样的内置支撑。

     ASP.NET Web API的内容协商(Content Negotiation)机制的抱负状况是如许的:客户端在要求头的Accept字段中指定甚么样的MIME范例,Web API服务端就返回对应的MIME范例的内容(响应头的中Content-Type就是Accept中指定的MIME范例)。而现实状况是,Web API服务端能返回甚么MIME范例的响应范例取决于有无对应这个MIME范例的MediaTypeFormatter。ASP.NET Core Web API的默许供应JsonMediaTypeFormatter,若是要支撑 XmlMediaTypeFormatter须要举行设置装备摆设。

      ASP.NET Core MVC 运用的默许花样是 JSON。 内容协商由 ObjectResult 完成。 它还内置于从资助递次要领(悉数基于 ObjectResult)返回的特定于状况代码的操纵效果中。 还能够返回一个模子范例(已界说为数据传输范例的类),框架将自动将其打包在 ObjectResult 中。

      以下操纵要领返回一个对象实例和 NotFound 资助递次要领:     

[HttpGet("{id}")]
        public async Task<ActionResult<Book>> GetBookItem(int id)
        {
            var bookItem = await _context.Book.FindAsync(id); 

            if (bookItem == null)
            {
                return NotFound();
            }
            return bookItem;
        }

    将返回 JSON 花样的响应,除非要求了另一个花样且服务器能够返回所要求花样。 能够运用 Rester东西建立包罗 Accept 标头的要求并指定另一种花样。 在此状况下,若是服务器有能够天生所要求花样的响应的花样化递次,则效果会以服务器首选的花样返回。

    1) 在Visual Studio 2017中按F5,启动BookApi应用递次。

    2) 翻开Firefox阅读器,并翻开 Rester,在Reseter中,将 HTTP 要领设置为 GET

   3) 然后在URL输入框中输入要猎取的对象URI,比方 http://localhost:5000/api/book/25

   4) 挑选“Headers”选项卡,挑选“Accept”选项,并将值设置为 JSON (application/json)。

    5) 运用鼠标点击“Send”按钮。要求将收到具有作书本数据的“200 一般”响应。以下图。

 运用 ASP.NET Core MVC 建立 Web API——相应数据的内容协商(七)

     6) 挑选“Headers”选项卡,挑选“Accept”选项,并将值设置为 xml (application/xml)。

     7) 运用鼠标点击“Send”按钮。要求将收到具有作书本数据的“200 一般”响应。以下图。我们虽然指定 Accept为 application/xml,然则在默许状况下,ASP.NET Core MVC 仅支撑 JSON。以是,纵然指定另一种花样,返回的效果仍然是 JSON 花样,而不是我们愿望的xml。以下图。

 运用 ASP.NET Core MVC 建立 Web API——相应数据的内容协商(七)

      控制器操纵能够返回 POCO(一般旧 CLR 对象),在这类状况下,ASP.NET Core MVC 将自动建立打包对象的 ObjectResult。 客户端将猎取设有花样的序列化对象(默许为 JSON 花样,能够设置装备摆设 XML 或其他花样)。 若是返回的对象为 null,那末框架将返回 204 No Content 响应。

    1) 在Visual Studio 2017中翻开BookController.cs文件,增加以下 GetBook 要领返回实体对象,代码以下:

[HttpGet("{id}")]
        public  Book GetBook(int id)
        {
            var bookItem =  _context.Book.Find(id);       
            return bookItem;
        }

     2)在Visual Studio 2017中按F5启动Web应用递次。

    3) 翻开阅读器,一并翻开Rester。

     4) 将 HTTP 要领设置为 GET。将要求 URL 设置为 http://localhost:5000/api/Book/25

    5) 运用鼠标点击“Send”按钮。要求将收到具有作书本数据的“200 一般”响应。以下图。

运用 ASP.NET Core MVC 建立 Web API——相应数据的内容协商(七)

   6) 要求无效将收到“204 无内容”响应。 以下图。

 运用 ASP.NET Core MVC 建立 Web API——相应数据的内容协商(七)

    设置装备摆设花样化递次

       若是应用递次须要支撑默许 JSON 花样之外的其他花样,那末能够增加 NuGet 包并设置装备摆设 MVC 来支撑它们。输入和输出的花样化递次分歧。输入花样化递次由模子绑定运用;输出花样化递次用来设置响应花样。 还能够设置装备摆设自界说花样化递次。要求头的Accept中除非指定为application/xml或许application/json,不然指定别的任何MIME,

      增加 XML 花样支撑

      在Visual Studio 2017若要增加对 XML 花样的支撑,请装置 Microsoft.AspNetCore.Mvc.Formatters.Xml NuGet 包。

     1. 在Visual Studio 2017的菜单>东西>选项对话框中,挑选“NuGet包治理器”中的通例,依据本身须要,设置默许包治理花样,以下图。

运用 ASP.NET Core MVC 建立 Web API——相应数据的内容协商(七)

     2. 在解决方案资源治理器中,右键单击“援用”,挑选“治理 NuGet 递次包”,以下图。

 运用 ASP.NET Core MVC 建立 Web API——相应数据的内容协商(七)

     3.将“nuget.org”挑选为“包源”,挑选“阅读”选项卡并搜刮“Microsoft.AspNetCore.Mvc.Formatters.Xml”,在列表中挑选该包,然后挑选“装置”,以下图。

 运用 ASP.NET Core MVC 建立 Web API——相应数据的内容协商(七)

      4.在Visual Studio 2017中翻开Startup.cs文件,将 XmlSerializerFormatters 设置装备摆设增加到 Startup类的ConfigureServices要领中。代码以下:

public void ConfigureServices(IServiceCollection services)
        {
            services.AddDbContext<BookContext>(options =>   options.UseSqlServer(Configuration.GetConnectionString("BookContext"))); 
services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2) .AddXmlSerializerFormatters(); }

      或许,能够仅增加输出花样化递次:

services.AddMvc(options =>
{
    options.OutputFormatters.Add(new XmlSerializerOutputFormatter());
});

   经由历程上面的代码我们增加了对 XML 花样的支撑,控制器要领会基于要求的 Accept 标头返回响应的花样。接下来我们来测试一下。

     1) 在Visual Studio 2017中按F5,启动BookApi应用递次。

     2) 翻开Firefox阅读器,并翻开 Rester,在Reseter中,将 HTTP 要领设置为 GET

     3) 挑选“Headers”选项卡,挑选“Accept”选项,并将值设置为 xml (application/xml)。

     4) 运用鼠标左键,单击“SEND”按钮。 响应返回200,响应窗格显现 Content-Type: application/xml 标头,且 Book 对象已序列化为 XML。以下图。

 运用 ASP.NET Core MVC 建立 Web API——相应数据的内容协商(七)

     5) 挑选“Headers”选项卡,挑选“Accept”选项,并将值设置为 JSON (application/json)。

      6) 运用鼠标左键,单击“SEND”按钮。 响应返回200,响应窗格显现 Content-Type: application/json 标头,且 Book 对象已序列化为 JSON。以下图。从图片中能够看到要求了设置 Accept: application/json 的标头,且响应也将它指定为其 Content-TypeBOOK 对象以 JSON 花样显现在响应正文中。

运用 ASP.NET Core MVC 建立 Web API——相应数据的内容协商(七)

     内容协商历程

      内容协商仅在 Accept 标头出现在要求中时发作。 要求包罗 accept 标头时,框架会以最好递次罗列 accept 标头中的媒体范例,而且实验查找能够天生一种由 accept 标头指定花样的响应的花样化递次。 若是未找到能够知足客户端要求的花样化递次,框架将实验找到第一个能够天生响应的花样化递次(除非开发人员设置装备摆设 MvcOptions 上的选项以返回“406 弗成接收”)。 若是要求指定 XML,然则未设置装备摆设 XML 花样化递次,那末将运用 JSON 花样化递次。 一般来说,若是没有设置装备摆设能够供应所要求花样的花样化递次,那末运用第一个能够设置对象花样的花样化递次。 若是不供应任何标头,则将运用第一个能够处置惩罚要返回的对象的花样化递次来序列化响应。 在此状况下,没有任何协商发作 - 服务器肯定将运用的花样。

         若是 Accept 标头包罗 */*,则将疏忽该标头,除非 RespectBrowserAcceptHeaderMvcOptions 上设置为 true。

avatar