探秘如何操作 ASP.NET Web API (二)

来源:http://www.cnblogs.com/gdsblog/archive/2017/06/13/6999474.html
-Advertisement-
Play Games

這個項目深刻的為我們講解了pc客戶端如何請求webapi 相信大家在看了我轉載的第一篇文章和這篇文章之後,對webapi再也不會懼怕了! 討論webapi的知識,歡迎加我微信 jkxx123321 交流 WCF的野心造成了它的龐大複雜,HTTP的單純造就了它的簡單優美。為了實現分散式Web應用,我們 ...


這個項目深刻的為我們講解了pc客戶端如何請求webapi 相信大家在看了我轉載的第一篇文章和這篇文章之後,對webapi再也不會懼怕了!


 

討論webapi的知識,歡迎加我微信  jkxx123321 交流


 

 

WCF的野心造成了它的龐大複雜,HTTP的單純造就了它的簡單優美。為了實現分散式Web應用,我們不得不將兩者湊合在一起 —— WCF服務以HTTP綁定宿主於IIS。

 

於是有了讓人暈頭轉向的配置、讓人鬱悶不已的調試,還有那ServiceContract, DataContract, EnumMember...還有還有,不要在using語句中調用WCF服務...

 

於是經常自問:拿著牛刀削蘋果有必要嗎?廢話,當然沒有必要,水果刀在哪裡?

 

微軟看著這麼多人拿著牛刀削蘋果,自己也看不下去了,於是,一種水果刀橫空出世 —— ASP.NET Web API。

 

最近我們在實際開發中有個地方用WCF太麻煩,就小試了一下水果刀,感覺還不錯。

 

下麵用一個簡單的示例分享一下ASP.NET Web API水果刀的用法。

 

服務端ASP.NET Web API的實現

 

需要準備的工具:Visual Studio 2010, NuGet

 

1. 新建一個空的ASP.NET Web Application項目。

 

 

2. 通過NuGet添加ASP.NET Web API的引用,在NuGet中搜索時要用“AspNetWebApi”(用“ASP.NET Web API”是搜索不到的),然後選擇ASP.NET Web API(Beta)進行安裝。

 

 

3. 添加Global.asax,在Application_Start中註冊Web API的路由,在Global.asax.cs中添加如下代碼:

 

protected void Application_Start(object sender, EventArgs e)
{
    RouteTable.Routes.MapHttpRoute("WebApi", "api/{controller}/{action}/{id}", 
        new { id = RouteParameter.Optional });
}

 

4. 添加Controllers文件夾,在其中添加類文件DemoController.cs,並讓DemoController繼承自ApiController。代碼如下:

 

複製代碼
namespace CNBlogsWebApiDemo.Controllers
{
    public class DemoController : ApiController
    {
    }
}
複製代碼

 

5. 添加ViewModels文件夾,在其中添加Site.cs,並定義Site。

 

複製代碼
namespace CNBlogsWebApiDemo.ViewModels
{
    public class Site
    {
        public int SiteId { get; set; }
        public string Title { get; set; }
        public string Uri { get; set; }
    }
}
複製代碼

 

6. 給DemoController添加一個方法SiteList,並寫上我們的示例代碼。代碼如下:

 

複製代碼
public class DemoController : ApiController
{
    public IList<Site> SiteList(int startId, int itemcount)
    {
        var sites = new List<Site>();
        sites.Add(new Site { SiteId = 1, Title = "test", Uri = "www.cnblogs.cc" });
        sites.Add(new Site { SiteId = 2, Title = "博客園首頁", Uri = "www.cnblogs.com" });
        sites.Add(new Site { SiteId = 3, Title = "博問", Uri = "q.cnblogs.com" });
        sites.Add(new Site { SiteId = 4, Title = "新聞", Uri = "news.cnblogs.com" });
        sites.Add(new Site { SiteId = 5, Title = "招聘", Uri = "job.cnblogs.com" });

        var result = (from Site site in sites
                        where site.SiteId > startId
                        select site)
                        .Take(itemcount)
                        .ToList();
        return result;
    }
}
複製代碼

 

7. 配置一下Web項目的啟動設置Specific Page與Specific port

 

 

8. Ctrl+F5運行項目,結果如下:

 

 

結果是我們期望的,用瀏覽器直接可以查看Web API的運行結果,測試時會很方便。

 

好了,服務端Web API就這麼輕鬆搞定了!

 

客戶端通過HttpClient調用服務端Web API

 

1. 新建一個WebApiTest的類庫項目。

 

2. 在NuGet中添加System.Net.Http(HttpClient就在這裡), Json.NET, xUnit.net。

 

3. 添加類文件WebApiClientTest.cs,添加測試方法WebApi_SiteList_Test:

 

複製代碼
namespace WebApiClientTest
{
    public class WebApiClientTest
    {
        [Fact]
        public void WebApi_SiteList_Test()
        {

        }
    }
}
複製代碼

 

4. WebApi_SiteList_Test() 的代碼實現

 

4.1 首先,要確定三個東西:

 

  a) 客戶端調用WebAPI的方式是Http Get,還Http Post,我們這裡選用Http Post;

 

  b) 客戶端調用WebAPI時傳遞的參數格式,我們這裡選用的是Json。

 

  c) WebAPI返回的數據格式,我們這裡選用的也是Json(這也是之前添加Json.NET引用的原因)。

 

4.2 用到的類

 

  • System.Net.Http.HttpClient
  • System.Net.Http.httpContent
  • System.Net.Http.StringContent
  • System.Net.Http.Headers.MediaTypeHeaderValue
  • Newtonsoft.Json.JsonConvert

 

4.3 準備需要傳遞給WebAPI的參數

 

  需要傳遞的兩個參數是startId ,itemcount,傳遞的格式是Json。這裡可沒有Javascript中的JSON.stringify(),但我們有Json.NET,再加上匿名類型,有點用js的感覺,代碼如下:

 

var requestJson = JsonConvert.SerializeObject(new { startId = 1, itemcount = 3 });

 

  代碼的運行結果:{"startId":1,"itemcount":3}

 

  然後用System.Net.Http.StringContent把它打個包:

 

HttpContent httpContent = new StringContent(requestJson);

 

  然後設置一下ContentType:

 

httpContent.Headers.ContentType = new MediaTypeHeaderValue("application/json");

 

4.4 通過Http Post調用WebAPI得到返回結果

 

  HttpClient閃亮登場,調用它的PostAsync()方法輕鬆搞定:

 

var httpClient = new HttpClient();
var responseJson = httpClient.PostAsync("http://localhost:9000/api/demo/sitelist", httpContent)
    .Result.Content.ReadAsStringAsync().Result;

 

  看一下responseJson的結果:

 

[{"SiteId":2,"Title":"博客園首頁","Uri":"www.cnblogs.com"},{"SiteId":3,"Title":"博問","Uri":"q.cnblogs.com"},{"SiteId":4,"Title":"新聞","Uri":"news.cnblogs.com"}]

 

  正宗的Json!你註意到沒有,服務端WebAPI的代碼未作任何修改,我們只是在Http Headers中將ContentType設置為了application/json,返回的就是Json格式的數據。而我們通過瀏覽器訪問,得到的還是標準的XML。這裡就是ASP.NET Web API的魅力之一 —— 一次實現,按需服務。

 

4.5 將Json格式返回的結果反序列化為強類型

 

  Json.NET又登場:

 

var sites = JsonConvert.DeserializeObject<IList<Site>>(responseJson);

 

  展示一下返回結果:

 

  代碼

 

sites.ToList().ForEach(x => Console.WriteLine(x.Title + "" + x.Uri));

 

  結果  

 

  博客園首頁:www.cnblogs.com
  博問:q.cnblogs.com
  新聞:news.cnblogs.com

 

4.6 WebApi_SiteList_Test() 完整實現代碼

 

複製代碼
public class WebApiClientTest
{
    [Fact]
    public void WebApi_SiteList_Test()
    {            
        var requestJson = JsonConvert.SerializeObject(new { startId = 1, itemcount = 3 });

        HttpContent httpContent = new StringContent(requestJson);
        httpContent.Headers.ContentType = new MediaTypeHeaderValue("application/json");

        var httpClient = new HttpClient();
        var responseJson = httpClient.PostAsync("http://localhost:9000/api/demo/sitelist", httpContent)
            .Result.Content.ReadAsStringAsync().Result;

        var sites = JsonConvert.DeserializeObject<IList<Site>>(responseJson);

        sites.ToList().ForEach(x => Console.WriteLine(x.Title + "" + x.Uri));
    }
}
複製代碼

 

註:運行這裡的代碼之前,要先運行WebAPI項目,先把服務跑起來,客戶端才能享受到服務。

 

與jQuery ajax調用代碼比較一下:

 

複製代碼
var requestJson = JSON.stringify({ startId: 1, itemcount: 3 });
$.ajax({
    url: '/api/demo/sitelist',
    data: requestJson,
    type: "post",
    dataType: "json",
    contentType: "application/json; charset=utf8",
    success: function (data) {
        jQuery.each(data, function (i, val) {
            $("#result").append(val.Title + ': ' + val.Uri +'<br/>');
        });
    }
});
複製代碼

 

註:上面的代碼是可真實運行的哦,代碼在示例代碼WebApiDemo項目的AjaxWebApi.htm文件中。這也是ASP.NET Web API “一次實現,按需服務”的體現。

 

小結 

 

水果刀(ASP.NET Web API)用下來感覺還不錯,不僅可以削蘋果,還可以削梨子,切西瓜也不在話下。用不用牛刀(WCF),還得多考慮考慮。

 


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

-Advertisement-
Play Games
更多相關文章
  • Hello all , 我又回來了 這次我們真是開始來聊聊開源項目里,小而有用的模塊或者組件的開發思想。 同時,軟體已經更新到1.60的版本了,支持新用戶註冊,可以不再使用統一的test賬戶了。 您可以通過以下路徑進行下載: 1、在GitHub上fellow一下項目,下載到本地,生成一下,即可獲取最 ...
  • 很多人都說使用反射會有性能問題,那到底會比直接調用慢多少呢,下麵就來測試一下。 直接調用vs反射調用 下麵就來寫個demo來驗證下直接調用和反射調用的性能差異,代碼如下: 測試結果: 從100萬次調用結果來看,確實就像很多人所說的,兩者在性能上具有數量級的差距。 為什麼反射有性能損失 既然反射性能有 ...
  • C#編譯器對靜態類進行瞭如下限制: 1,靜態類必須直接從基類System.Obect派生,從其他任何基類派生都沒有意義。繼承只適用於對象,而你不能創建靜態類的實例 2,靜態類不能實現任何介面,這是因為只有適用類的實例時,才可調用介面方法 3,靜態類只能定義靜態成員(欄位,方法,屬性和事件),任何實例 ...
  • 前面總結了反射的使用,這一篇結合一個完整的項目來總結下反射的實際應用。 項目結構 如下圖: 定義插件介面 在項目ConsoleApplication6.IService中,定義了兩個介面,Run代表行駛,Trun代表轉向,如下代碼: 插件程式實現 這裡新建了兩個項目分別實現插件程式,分別是Conso ...
  • 裝箱: 值類型比引用類型“輕”,原因是他們不作為對象在托管堆中分配,不被垃圾回收,也不通過指針進行引用。但是許多時候都需要獲取值類型的引用,例如,假定要創建ArrayList對象來容納一組point結構,代碼如下: public sealed class Program { public stati ...
  • 經過我三篇文章的解惑,webapi我相信大家沒有問題了! 先創建了一個UserModel 然後添加Web API Controller 註冊路由 在Global中註冊 這個時候用地址欄訪問地址:api/user/getadmin 這個時侯預設返回的是XML數據模型。 使用AJAX請求這個api,指定 ...
  • 由於公司的工作安排,一直在研究其他技術,所以一直沒時間更新博客,今天終於可以停下手頭的事情,寫一些新內容了。 應用場景:企業門戶網站會根據內容不同,設置不同的板塊,如新浪有體育,娛樂頻道,等等。有的情況下需要給不同的板塊設置不同的二級功能變數名稱,如新浪體育sports.sina.com.cn。 在asp. ...
  • 大學畢業已三年,菜鳥稱謂依然。畢業前使用過六個月的MVC,但是自從畢業後因為公司一直在用webForm,所以MVC就沒有再用過。直到最近打算用MVC做一個項目管理系統,才發現MVC已經變得陌生了,只有再從新學起。為了防止自己的拖延症拖延自己的學習計劃,特在博客園寫此文。學習期間,所有的感悟和整理的可 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...