使用 ASP.NET Core MVC 創建 Web API——響應數據的內容協商(七)

来源:https://www.cnblogs.com/chillsrc/archive/2019/05/14/10861728.html
-Advertisement-
Play Games

ASP.NET Core MVC 包含對通過固定格式或根據客戶端規範來設置響應數據格式的內置支持。 ASP.NET Web API的內容協商(Content Negotiation)機制的理想情況是這樣的:客戶端在請求頭的Accept欄位中指定什麼樣的MIME類型,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 創建 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 正常”響應。如下圖。

 

     6) 選擇“Headers”選項卡,選擇“Accept”選項,並將值設置為 xml (application/xml)。

     7) 使用滑鼠點擊“Send”按鈕。請求將收到具有作書籍數據的“200 正常”響應。如下圖。我們雖然指定 Accept為 application/xml,但是在預設情況下,ASP.NET Core MVC 僅支持 JSON。所以,即使指定另一種格式,返回的結果仍然是 JSON 格式,而不是我們希望的xml。如下圖。

 

      控制器操作可以返回 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 正常”響應。如下圖。

   6) 請求無效將收到“204 無內容”響應。 如下圖。

 

    配置格式化程式

       如果應用程式需要支持預設 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包管理器”中的常規,根據自己需要,設置預設包管理格式,如下圖。

     2. 在解決方案資源管理器中,右鍵單擊“引用”,選擇“管理 NuGet 程式包”,如下圖。

 

     3.將“nuget.org”選擇為“包源”,選擇“瀏覽”選項卡並搜索“Microsoft.AspNetCore.Mvc.Formatters.Xml”,在列表中選擇該包,然後選擇“安裝”,如下圖。

 

      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。如下圖。

 

     5) 選擇“Headers”選項卡,選擇“Accept”選項,並將值設置為 JSON (application/json)。

      6) 使用滑鼠左鍵,單擊“SEND”按鈕。 響應返回200,響應窗格顯示 Content-Type: application/json 標頭,且 Book 對象已序列化為 JSON。如下圖。從圖片中可以看到請求了設置 Accept: application/json 的標頭,且響應也將它指定為其 Content-TypeBOOK 對象以 JSON 格式顯示在響應正文中。


     內容協商過程

      內容協商僅在 Accept 標頭出現在請求中時發生。 請求包含 accept 標頭時,框架會以最佳順序枚舉 accept 標頭中的媒體類型,並且嘗試查找可以生成一種由 accept 標頭指定格式的響應的格式化程式。 如果未找到可以滿足客戶端請求的格式化程式,框架將嘗試找到第一個可以生成響應的格式化程式(除非開發人員配置 MvcOptions 上的選項以返回“406 不可接受”)。 如果請求指定 XML,但是未配置 XML 格式化程式,那麼將使用 JSON 格式化程式。 一般來說,如果沒有配置可以提供所請求格式的格式化程式,那麼使用第一個可以設置對象格式的格式化程式。 如果不提供任何標頭,則將使用第一個可以處理要返回的對象的格式化程式來序列化響應。 在此情況下,沒有任何協商發生 - 伺服器確定將使用的格式。

         如果 Accept 標頭包含 */*,則將忽略該標頭,除非 RespectBrowserAcceptHeaderMvcOptions 上設置為 true。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 1新建NetCore項目,我這裡NetCoreSDK版本是2.2.0。 2.進入NuGet程式包官網 : https://www.nuget.org,搜索以下兩個包並安裝到項目中。 Microsoft.Extensions.Logging.Log4Net.AspNetCore Log4Net 打開項 ...
  • 背景 一、微信檢測手段 二、功能變數名稱被封常見因素 三、功能變數名稱檢測原理 四、檢測代碼(C#) 五、防封方案 六、參考資料 背景 最近因為業務需要,在研究微信跳轉,功能變數名稱防封檢測等東西,網上搜集了很多很多資料,發現居然這麼簡單的一點東西 居然有人專門做成系統拿去賣錢.. 系統功能就只是個微信跳轉而已,微信跳外部 ...
  • Visual Studio 2019 Enterprise(企業版)BF8Y8-GN2QH-T84XB-QVY3B-RC4DFVisual Studio 2019 Professional(專業版)NYWVH-HT4XC-R2WYW-9Y3CM-X4V3Y ...
  • 註:本博客適合剛開始學習winform程式的初學者,大牛請繞道(跪求大牛指導文中不足) .....10w字廢話自動省略,直接開始正題. 首先從最基本的建立winform開始(本項目用的Vs2017) 新建->項目->選中C#->選擇Windows窗體應用->確定 創建完成後可以點擊工具欄進行拖拽控制項 ...
  • 最近項目移動端需要實現微信自定義分享功能,包含分享自定義標題、描述等。 首先到公眾號的後臺,功能設置裡面,添加將要被分享的功能變數名稱,如圖 後端簽名演算法實現 ,參考騰訊開發者文檔https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp142114111 ...
  • DSAPI.文件.CMD命令行進程代理,是用來和CMD.exe或指定exe進行輸出重定向的簡化使用工具,可隱藏或顯式地啟動一個cmd.exe,並將輸出流、輸入流和錯誤流重定向至代理,通過事件觸發方式與之交互。 相關代碼如下: ...
  • 文/雲之幻 前不久,博客作者 Bravo Yeung 寫了一篇還算略受歡迎的關於 RSS 的文章 ".Net開發者必知的技術類RSS訂閱指南" 。 RSS 現在用的人很少了,而且就算是我,也不過是在一周前才開始正視 RSS 。只因為接觸到了一個很好很強大的社區 RSS Hub ,當時看到之後就立刻做 ...
  • Echarts基本顯示: var c1 = echarts.init(document.getElementById('pic_01')); var op1= { title : { text: '某地區蒸發量和降水量', subtext: '純屬虛構' }, tooltip : { trigger ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...