[轉]Web Api系列教程第2季(OData篇)(二)——使用Web Api創建只讀的OData服務

本文轉自:http://www.cnblogs.com/fzrain/p/3923727.html

前言

很久沒更新了,之前有很多事情,所以拖了很久,非常抱歉。好了,廢話不多說,下面開始正題。本篇仍然使用上一季的的項目背景(系列地址http://www.cnblogs.com/fzrain/p/3490137.html)來演示OData服務,因此我們可以直接使用之前建好的數據訪問層。但是不是說一定要看到之前的所有內容,我們只是借用數據庫訪問層,對于數據庫的模型構建移步(使用Entity Framework Code First構建數據庫模型)。

有了數據訪問的基礎,我們可以開始構建OData服務了。

第一步:創建空的Web Api項目

image_thumb1

打開項目的解決方案,新建web項目,選擇空的web api項目(如上圖所示),記得選擇.Net Framework 4.5。建好項目之后需要添加對“EntityFramework”和“Learning.Data”(我們的數據訪問層)的引用。

第二步:添加OData引用

在默認的情況下,Web Api是無法支持OData的,因此我們需要添加對“Microsoft.ASP.NET Web API 2.1 OData”的引用——打開NuGet如下圖所示:

image_thumb4

第三步:配置OData路由

打開“App_Start”文件夾中系統幫我們創建的“WebApiConfig”類,在這里有一個Register方法并注冊路由規則。我們需要配置的OData也是寫在這里,代碼如下:

復制代碼
public static class WebApiConfig{public static void Register(HttpConfiguration config){// Web API 配置和服務// Web API 路由config.MapHttpAttributeRoutes();config.Routes.MapHttpRoute(name: "DefaultApi",routeTemplate: "api/{controller}/{id}",defaults: new { id = RouteParameter.Optional });config.Routes.MapODataRoute("elearningOData", "OData", GenerateEdmModel());}private static IEdmModel GenerateEdmModel(){var builder = new ODataConventionModelBuilder();builder.EntitySet<Course>("Courses");builder.EntitySet<Enrollment>("Enrollments");builder.EntitySet<Subject>("Subjects");builder.EntitySet<Tutor>("Tutors");return builder.GetEdmModel();}}
復制代碼

雖然我們只是使用OData服務,但我并沒有移除默認的配置因為這兩種路由規則是可以共存的。

上面為我們的OData服務配置了路由規則以及實體數據模型(EDM)

EDM主要是定義數據類型、導航屬性和方法來適應OData的格式。有2種方式來定義EDM,第一種是基于公約的方式,我們將使用“ODataConventionModelBuilder”類,另一種則是使用“ODataModelBuilder”。

在這里我們將使用“ODataConventionModelBuilder?”因為它會根據我們定義的導航屬性來生成關聯集合的鏈接。相比來說寫的代碼比較少。如果你想在關聯集合間有更多的控制,那么你可以使用“ODataModelBuilder”。

我們在builder對象中添加了4個不同的實體,注意:字符串參數“Courses”定義的實體集合名字必須與Controller的名字保持一致,也就是說我們的controller的名字必須是“CoursesController”。

MapODataRoute”是一個擴展方法,當我們添加對OData引用時就可以使用了。它主要為OData服務來定義路由規則的:第一個參數指定一個名字,這個名字客戶端是不會用到的;第二個參數是指對應OData終結點的URI前綴(在我們的案列中訪問Courses資源的URI就應該是:http://hostname/odata/Courses)。你可以在同一個應用程序中擁有多個OData終結點,只需要調用“MapODataRoute”方法指定不同的前綴就行了。

第四步:添加第一個只讀的OData控制器

現在我們創建一個Web Api控制器來處理OData URI類似“/odata/Courses”的HTTP請求。右擊controller文件夾->新增->選擇“空的API控制器”模板并命名“CoursesController”。

創建好之后,首先將我們的基類改成“System.Web.Http.OData.EntitySetController”。這個泛型基類需要2個參數:第一個指映射到這個controller對應的實體類型;第二個參數是指這個實體主鍵的類型,下面上代碼:

復制代碼
public class CoursesController : EntitySetController<Course, int>{LearningContext ctx = new LearningContext();[Queryable(PageSize = 10)]public override IQueryable<Course> Get(){return ctx.Courses.AsQueryable();}protected override Course GetEntityByKey(int key){return ctx.Courses.Find(key);}}
復制代碼

“EntitySetController”類定義了很多抽象和可重寫的方法來更新和查詢實體,因此你會發現你可以重寫很多的方法例如:Get(),GetEntityByKey(),CreateEntrty(),PatchEntity(),UpdateEntity(),etc…

正如我前面提到的,我們將創建一個只讀的控制器,這就意味著我們只實現讀取的操作,解釋一下上面代碼的實現:

1.重寫Get()方法并附上[Queryable]特性,這意味著我們允許客戶端發送HTTP的Get到我們的終結點并在URI參數值支持filter,order by,pagination的操作。Queryable特性是一個action過濾器,主要轉換和校驗查詢的URI及相應參數,當客戶端查詢將花費很多時間或者大量數據時候這個特性將會有意想不到的作用(舉個例子:設置PageSize屬性,這樣一次性只會給客戶端返回10條數據)

2.重寫GetEntityByKey(int key)方法將支持客戶端發送HTTP訪問單個資源,形式類似于“/odata/Courses(5)”。注:這里的key代表對應實體的主鍵。

第五步:測試Courses控制器

現在我們開始測試我們的controller,對于所有的請求我們都將accept header指定為“application/json”,因此我們將獲得輕量JSON數據,你也可以去指定accept header為“application/json;odata=verbose”或者“application/atom+xml”來查看結果。

我們演示一下場景:

1.$filter:我們查詢所有時長超過4小時的課程:發送Get請求http://{hostname}/OData/Courses?$filter=Duration?gt 4

2.$orderby, $take:我們需要根據課程名排序并獲取前5條記錄:發送Get請求http://{hostname}/OData/Courses?$orderby=Name&$top=5

3.$select:我們僅需要獲取Name和Duration字段的值:發送Get請求http://{hostname}/OData/Courses?$select=Name,Duration

4.$expand:我們需要獲取每個課程對應的主題和講師并根據課程名倒序排列:發送Get請求http://{hostname}/OData/Courses?$expand=CourseTutor,CourseSubject&$orderby=Name?desc

通過剛剛4個例子我們可以看到在我們的返回結果中包含了UserName和Password這兩個字段,但個信息是沒必要給客戶端的。,

image

十分幸運的是我們只需要去配置一下EDM就可以在返回結果中不包含這兩個字段了,具體做法在WebApiConfig類中的GenerateEdmModel()方法里加入如下代碼:

復制代碼
private static IEdmModel GenerateEdmModel(){var builder = new ODataConventionModelBuilder();builder.EntitySet<Course>("Courses");builder.EntitySet<Enrollment>("Enrollments");builder.EntitySet<Subject>("Subjects");builder.EntitySet<Tutor>("Tutors");var tutorsEntitySet = builder.EntitySet<Tutor>("Tutors");tutorsEntitySet.EntityType.Ignore(s => s.UserName);tutorsEntitySet.EntityType.Ignore(s => s.Password);return builder.GetEdmModel();}
復制代碼

源碼地址:https://github.com/fzrain/WebApi.eLearning

作者:FZRAIN
出處:http://fzrain.cnblogs.com/
本文版權歸作者和博客園共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接,否則保留追究法律責任的權利。

?

轉載于:https://www.cnblogs.com/freeliver54/p/6924535.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/372057.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/372057.shtml
英文地址,請注明出處:http://en.pswp.cn/news/372057.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

使用Spring 3 MVC處理表單

本文是有關Spring 3的一系列文章的一部分。該系列的上一篇文章可以在此處獲得 。 在本文中&#xff0c;我們向Spring MVC邁出了又一步。 [此外&#xff1a; 術語MVC的創建者提供的pdf 。]從上一篇文章構建&#xff0c;讓我們添加將“聯系人”添加到應用程序所需的代碼。 首先&a…

插入排序法之——直接插入排序、折半插入排序、希爾排序

// test20.cpp : 定義控制臺應用程序的入口點。 // #include "stdafx.h" #include<iostream> #include<vector> #include<string> #include<queue> #include<stack> #include<cstring> #include<string.h> #include<de…

linux idea 快捷鍵,Linux 下 IDEA 的 Ctrl+Alt+S

前言這是個困擾我一年多的問題&#xff0c;今天終于解決了……起因一年前將主系統換成 Arch Linux 后&#xff0c;其他一切正常就是 IDEA 的打開設置的快捷鍵 ctrlalts 失效&#xff0c;讓我很是頭疼。雖然不是很重要&#xff0c;但是對于我這種強迫癥來說別提多難受了……我曾…

修改input的placeholder顏色

1、CSS選擇器 因為每個瀏覽器的CSS選擇器有所差異&#xff0c;所以需要針對每個瀏覽器做單獨的設定。 ::-webkit-input-placeholder { /* WebKit browsers */ color: #999; } :-moz-placeholder { /* Mozilla Firefox 4 to 18 */ color: #999; } ::-moz-placeholder { /* Mozil…

解決Spring自動裝配中的循環依賴

我認為這篇文章是在企業應用程序開發中使用Spring的最佳實踐。 使用Spring編寫企業Web應用程序時&#xff0c;服務層中的服務量可能會增加。 服務層中的每個服務可能會消耗其他服務&#xff0c;這些服務將通過Autowire注入。 問題&#xff1a;當服務數量開始增加時&#xff0…

01.MD5加密

namespace _01.MD5加密{ class Program { static void Main(string[] args) { //MD5加密就是給想要的密碼或者其它字符加密 //如果字符串被加密成MD5值之后,是不可逆的. //字符串123 的MD5 64位加密形式是 202cb962ac59075b964b07152d234b70 Console.WriteLine("請輸入需要…

C語言數字3轉變字符 3 程序,大學c語言知識點總結

大學c語言知識點總結C語言的設計目標是提供一種能以簡易的方式編譯、處理低級存儲器、產生少量的機器碼以及不需要任何運行環境支持便能運行的編程語言。一起來看看大學c語言知識點總結吧!大學c語言知識點總結1、編譯預處理不是C語言的一部分&#xff0c;不再運行時間。C語言編…

接觸Jenkins(Hudson)API,第1部分

哪一個-哈德森還是詹金斯&#xff1f; 都。 幾個月前&#xff0c;我開始使用Hudson v1.395來從事這個小項目&#xff0c;在出現巨大分歧之后又回到了這個項目。 我以此為契機&#xff0c;看我將來選擇永久搬到詹金斯時是否會遇到任何重大問題。 有很多麻煩-最值得注意的是&…

使用javascript模擬常見數據結構(四)

七、樹 樹是一種非線性的分層的數據結構&#xff0c;在現實生活中比較常見的例子比如家譜和公司的組織架構圖&#xff0c;如下所示&#xff1a; 一個樹結構存在著一系列的父子結構&#xff0c;并且有著一個根節點&#xff0c;這種結構本質上表明了一對多的關系。 那&#xff0c…

C語言中實際參數太多,c – 宏的實際參數太多了?

碼&#xff1a;#include using namespace std;#define ADD(x,y) ((x)(y))int main( int argc, char** argv ){cout << ADD(1,2,) << endl;return 0;}編譯器輸出&#xff1a;1>Compiling…1>main.cpp1>c:\warn_test\main.cpp(9) : warning C4002: too many…

Web開發框架–第2部分:Play Framework 2.0

作為 評估系列 的第一個候選人&#xff0c; 我們回顧了 Play Framework v2.0 。 可以從Play 文檔站點獲得本文所使用的教程和參考文檔。 本文的第一部分將介紹我們建議對每個框架執行的一組任務&#xff0c;然后繼續評估每個標準項。 在開發工作站中安裝框架 非常簡單&#…

最全Pycharm教程(10)——Pycharm調試器總篇

最全Pycharm教程&#xff08;1&#xff09;——定制外觀 最全Pycharm教程&#xff08;2&#xff09;——代碼風格 最全Pycharm教程&#xff08;3&#xff09;——代碼的調試、執行 最全Pycharm教程&#xff08;4&#xff09;——有關Python解釋器的相關配置 最全Pycharm教程&am…

Looper.prepare()和Looper.loop()

什么時候需要 Looper Looper用于封裝了android線程中的消息循環&#xff0c;默認情況下一個線程是不存在消息循環&#xff08;message loop&#xff09;的&#xff0c;需要調用Looper.prepare()來給線程創建一個消息循環&#xff0c;調用Looper.loop()來使消息循環起作用&#…

超速問題的c語言編程,超速行駛問題--精選.doc

超速行駛問題摘要本文主要研究的是探討驅車從始發地至目的地的最短時間路徑問題和最少花費問題&#xff0c;以及在超速情況下的最短時間和最少花費問題。首先&#xff0c;從整個題目的兩個問題入手&#xff0c;發現兩個問題都是優化問題&#xff0c;具有一定的聯系。然后針對第…

重新查看Play Framework發布的值

與Play Framework 2.0一起使用發布的值而不定義表單映射&#xff0c;可能不像Play 1.x那樣明顯&#xff0c;這就是為什么我要編寫此快速備忘單。 對于此快速示例&#xff0c;讓我們定義以下視圖&#xff1a; app / views / index.scala.html (message: String)message: messa…

matlab 微積分

符號變量&#xff0c;symbolic variable 1. 高階導數 高階導數的計算&#xff0c;當然可以用手工的方式&#xff0c;但顯然這種機械重復的推導&#xff0c;更適用于計算機的計算方式&#xff1a; f(x)sinxx24x3?d4fdx4>> syms x; >> f sin(x) / (x^24*x3); >&…

如何查看Ubuntu版本,以及Linux內核版本??

查看Ubuntu版本&#xff1a; 方法一&#xff1a; cat /etc/issue 方法二&#xff1a; sudo lsb_release -a 查看內核版本&#xff1a; uname -r 轉載于:https://www.cnblogs.com/tanrong/p/6937749.html

c語言編碼風格,講嵌入式C語言編碼風格.ppt

講嵌入式C語言編碼風格目 錄 簡介及說明 語言規則 1.基礎 2.數據 3.說明與表達式 4.函數 5.內存及資源 6.源文件 風格指導 7.程序書寫 8.命名 9.文檔 簡介及說明 正確性 易維護性 易移植性 代碼的高效性 語言規則——基礎 編寫清晰表達設計思路和意圖的代碼 針對易讀來優化代碼…

使用Gradle引導舊式Ant構建

Gradle提供了幾種不同的方式來利用您現有的對Ant的投資&#xff0c;包括積累的知識和您已經放入構建文件中的時間。 這可以極大地方便將Ant生成的項目移植到Gradle的過程&#xff0c;并為您提供逐步進行此操作的路徑。 Gradle文檔在描述如何在Gradle構建腳本中使用Ant方面做得很…

實現chrome擴展啟動本地進程 - 補充

實現chrome擴展啟動本地進程 - 補充 標簽&#xff1a; chrome擴展啟動本地程序訪問本地磁盤2014-10-17 11:42 6753人閱讀 評論(17) 收藏 舉報分類&#xff1a;Chrome Plugin版權聲明&#xff1a;本文為博主原創文章&#xff0c;未經博主允許不得轉載。 示例 主要包含如下部分 c…