麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

首頁 > 學(xué)院 > 開發(fā)設(shè)計 > 正文

使用ASP.NET Web Api構(gòu)建基于REST風(fēng)格的服務(wù)實戰(zhàn)系列教程【三】——Web Api入門

2019-11-15 02:25:51
字體:
供稿:網(wǎng)友

使用asp.net Web Api構(gòu)建基于REST風(fēng)格的服務(wù)實戰(zhàn)系列教程【三】——Web Api入門

系列導(dǎo)航地址http://www.companysz.com/fzrain/p/3490137.html

前言

經(jīng)過前2節(jié)的介紹,我們已經(jīng)把數(shù)據(jù)訪問層搭建好了,從本章開始就是Web Api部分了。在正式開始之前,再一次回顧一下Web Api的應(yīng)用場景:Web Api可以與 MVC,WebForm結(jié)合使用,也可以作為一個單獨的Web服務(wù)。在正式討論Web Api的配置以及如何構(gòu)造我們的URI來消費資源之前,我們必須理解Http方法與我們將要訪問的資源之間的關(guān)系。舉個簡單的例子,我們把模型”Course”作為我們訪問的資源,下面就列舉了訪問這個資源的http方法:

ActionHTTP VerbRelative URI
獲取所有課程信息GET/api/courses
根據(jù)某個Id獲取單個課程GET/api/courses/id
新增一個課程POST/api/coursesNew course is sent in POST body
更新一個課程PUT or PATCH/api/courses/idUpdated course is sent in POST body
刪除一個課程DELETE/api/courses/id

第一步:創(chuàng)建Web Api項目

右擊解決方案->添加新建項目

image

下一步:

image

點擊確定

第二步:配置第一個路由

在創(chuàng)建好項目之后,我們可以在App_Start文件夾下看到“WebApiConfig”類。這個類就是用來配置路由信息的,這個類最終會在“Global.asax”的application_Start()方法中被調(diào)用,后面我們會在這個這個類里面配置多條路由信息。

配置第一個路由:

config.Routes.MapHttPRoute(                name: "Courses",                routeTemplate: "api/courses/{id}",                defaults: new {controller="courses", id = RouteParameter.Optional }            );

分析一下上面這段代碼:我們創(chuàng)建了一個Courses的路由規(guī)則,這個路由模板會匹配到“api/courses/{id}”的URI,在這個模板定義了2個默認值(api,courses)以及一個可選值(id)。對于“/api/courses or /api/courses/5”URI就會被我們的路由模板匹配到,同時“/api/courses”URI也會被匹配到,因為Id是可選的。

第三步:添加第一個控制器(courses controller)

Web Api中的Controller是用來處理客戶端Http請求的(與MVC中的Controller類似),首先,創(chuàng)建Controller——右擊Controller文件夾->新建項->控制器

然后出現(xiàn)下面窗口:

image

選擇Web API 2控制器-空,并命名為CoursesController。然后確定

打開剛才創(chuàng)建的Controller,可以看到我們創(chuàng)建的類繼承自“ApiController”。同時對于這個類的類名必須是“CoursesController”,因為在Web Api中默認的控制器選擇方式是尋找所有繼承自“ApiController”類并且這個類是以“Courses”開頭(這是在我們的路由規(guī)則中配置的)的控制器。

第四步:在Controller中添加Action

首先,我們創(chuàng)建上述表格列舉到的前2個方法(GetAllCourses,GetCourseById)

方法的選擇是智能的,如果我們創(chuàng)建了2個方法Get()和GetCourse(int id),假設(shè)我們發(fā)送一個GET請求并且URI是“/api/courses/5”,那么“GetCourse(int id)”方法就會被選擇執(zhí)行,這是因為方法是以Get開頭而且URI中包含Id的值。這種選擇方式同樣適用以其他的Http方法(put,delete,post),下面上代碼:

public class CoursesController : ApiController    {        public List<Course> Get()        {            ILearningRepository repository = new LearningRepository(new LearningContext());             return repository.GetAllCourses().ToList();        }         public Course GetCourse(int id)        {            ILearningRepository repository = new LearningRepository(new LearningContext());             return repository.GetCourse(id);        }     }

當(dāng)我們創(chuàng)建一個Get請求并且URI是“http://localhost:{your_port}/api/courses”時候,Get()方法會被選擇調(diào)用,下面是相應(yīng)的部分代碼:

[    {        "Id": 1,        "Name": "History Teaching Methods 1",        "Duration": 3,        "DescrOutlook.com",            "UserName": "AhmadJoudeh",            "PassWord": "SWDQNPSE",            "FirstName": "Ahmad",            "LastName": "Joudeh",            "Gender": 0        },        "CourseSubject": {            "Courses": [],            "Id": 1,            "Name": "History"        },        "Enrollments": []    },    {        "Id": 2,        "Name": "History Teaching Methods 2",        "Duration": 3,        "Description": "The course will talk in depth about: History Teaching Methods 2",        "CourseTutor": {            "Courses": [],            "Id": 1,            "Email": "[email protected]",            "UserName": "AhmadJoudeh",            "Password": "SWDQNPSE",            "FirstName": "Ahmad",            "LastName": "Joudeh",            "Gender": 0        },        "CourseSubject": {            "Courses": [],            "Id": 1,            "Name": "History"        },        "Enrollments": []    },

如果你發(fā)送一個Get請求并且URI是“http://localhost:{your_port}/api/courses/5”。那么GetCourse(int id)將會被選擇調(diào)用執(zhí)行。但是很遺憾在調(diào)用這個方法之后就會產(chǎn)生一個異常,這個異常信息簡單來說就是“序列化對象的時候出現(xiàn)了循環(huán)依賴”,換句話說就是對象間循環(huán)引用(Course>Enrollment>Course>Enrollment>etc…)

總結(jié)

到目前為止我們已經(jīng)讓W(xué)eb Api跑起來了,但仍然有很多不足之處:

返回對象時出現(xiàn)循環(huán)依賴,可以通過模型工廠模式解決。

我們返回了領(lǐng)域模型中所有的字段給客戶端,然而有一些敏感信息不應(yīng)該返回(例如:password字段),解決方案:模型工廠模式

每一個返回給客戶端的資源都應(yīng)該包含一個URI以便客戶端查詢,解決方案依舊是模型工廠模式。

對于返回單個資源,我們應(yīng)當(dāng)返回相應(yīng)的狀態(tài)碼(例如:成功200,資源未找到404等),解決方案:HttpResponseMessage對象

在每個方法里我們都實例化了一個repository,這個對象包含了一些昂貴的操作(例如:數(shù)據(jù)庫連接),解決方案:依賴注入模式

對于返回的Json對象格式是以“帕斯卡”風(fēng)格的(例如“FirstName”),然而我們的Api有很大的可能被帶有javascript的客戶端消費,對于JS開發(fā)者來說可能更適合“駝峰”風(fēng)格(例如”firstName”)的數(shù)據(jù)。解決方案:配置Json格式。

ok,下一章我們就著重解決上述的問題

本章代碼:http://yun.baidu.com/share/link?shareid=2010367762&uk=17559114&third=0


發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 欧美一级片一区 | 全免费午夜一级毛片真人 | a级高清免费毛片av在线 | av在线在线 | 国产成年人小视频 | xnxx 美女19| 国产亚洲精品成人a | 亚洲资源在线播放 | 成人三级电影网站 | 在线亚洲播放 | 鲁丝片一区二区三区免费入口 | 久久久电影电视剧免费看 | 亚洲最新色 | 永久av在线免费观看 | 亚洲视频精选 | 欧美日韩高清一区二区三区 | 日韩黄色精品 | 久久99国产精品视频 | 精国产品一区二区三区四季综 | 秋霞a级毛片在线看 | 一级一级一级一级毛片 | 91福利国产在线观一区二区 | 狠狠干狠狠操 | 国产一精品一av一免费爽爽 | 国产亚洲精品久久久闺蜜 | 羞羞的视频在线观看 | 国产精品jk白丝蜜臀av软件 | japan护士性xxxⅹhd | 91成人一区 | 国产精品久久久久永久免费 | 国产无遮挡一区二区三区毛片日本 | 国产国语毛片 | 国内精品一级毛片免费看 | 黄色片在线播放 | 男男羞羞视频网站国产 | 色婷婷久久久 | 插插操 | 毛片视频网址 | 国产精品久久久久久影院8一贰佰 | 精品久久久久久久久久中出 | 在线看免电影网站 |