国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 學(xué)院 > 開(kāi)發(fā)設(shè)計(jì) > 正文

使用ASP.NET Web Api構(gòu)建基于REST風(fēng)格的服務(wù)實(shí)戰(zhàn)系列教程【六】——實(shí)現(xiàn)資源間的關(guān)聯(lián)

2019-11-15 02:29:39
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

使用asp.net Web Api構(gòu)建基于REST風(fēng)格的服務(wù)實(shí)戰(zhàn)系列教程【六】——實(shí)現(xiàn)資源間的關(guān)聯(lián)

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

前言

這一篇文章主要介紹一下資源間的關(guān)聯(lián)——例如在學(xué)生和課程之間就存在這樣的關(guān)聯(lián):每一個(gè)課程都會(huì)有多個(gè)學(xué)生來(lái)選,如何獲取這些有關(guān)聯(lián)的信息?如何實(shí)現(xiàn)選課的業(yè)務(wù)?對(duì)于客戶端應(yīng)該怎么來(lái)調(diào)用呢?下面給出解決方案:

配置對(duì)應(yīng)的路由

對(duì)于上面的需求,我們可以先定制一個(gè)URI模板:”api/courses/courseid/students/{userName}“,如果我們打算查詢所有選了courseId為5的學(xué)生,那么客戶端就應(yīng)該發(fā)送Get請(qǐng)求”api/courses/5/students/”.如果我們打算為用戶名為”TaiseerJoudeh“的學(xué)生選擇課程CourseId為5的課程,那么就應(yīng)該發(fā)送Post請(qǐng)求”api/courses/5/students/TaiseerJoudeh“。

為了實(shí)現(xiàn)上面說(shuō)的,我們首先要在”WebApiConfig“中添加如下一條路由信息:

config.Routes.MapHttPRoute(    name: "Enrollments",    routeTemplate: "api/courses/{courseId}/students/{userName}",    defaults: new { controller = "Enrollments", userName = RouteParameter.Optional });

可以看到在這里courseId是必選的,而userName是可選的

創(chuàng)建響應(yīng)的控制器

正如上面路由配置的,我們應(yīng)該有一個(gè)“EnrollmentsController”,在這個(gè)控制器中我們應(yīng)該包含2個(gè)方法:Get用來(lái)返回對(duì)應(yīng)的學(xué)生信息,Post用來(lái)實(shí)現(xiàn)學(xué)生選課,下面上代碼:

public class EnrollmentsController : BaseApiController    {        public EnrollmentsController(ILearningRepository repo)            : base(repo)        {        }        public IEnumerable<StudentBaseModel> Get(int courseId)        {            IQueryable<Student> query;            query = TheRepository.GetEnrolledStudentsInCourse(courseId).OrderBy(s => s.LastName);            var totalCount = query.Count();            System.Web.HttpContext.Current.Response.Headers.Add("X-InlineCount", totalCount.ToString());            var results = query                                               .ToList()                        .Select(s => TheModelFactory.Create(s));            return results;        }        public HttpResponseMessage Post(int courseId, [FromUri]string userName, [FromBody]Enrollment enrollment)        {            try            {                if (!TheRepository.CourseExists(courseId)) return Request.CreateErrorResponse(HttpStatusCode.BadRequest, "Could not find Course");                var student = TheRepository.GetStudent(userName);                if (student == null) return Request.CreateErrorResponse(HttpStatusCode.BadRequest, "Could not find Student");                var result = TheRepository.EnrollStudentInCourse(student.Id, courseId, enrollment);                if (result == 1)                {                    return Request.CreateResponse(HttpStatusCode.Created);                }                else if (result == 2)                {                    return Request.CreateResponse(HttpStatusCode.NotModified, "Student already enrolled in this course");                }                return Request.CreateResponse(HttpStatusCode.BadRequest);            }            catch (Exception ex)            {                return Request.CreateErrorResponse(HttpStatusCode.BadRequest, ex);            }        }    }

在Post方法中我們使用了FormURL和FormBody的特性,這樣就表明我們將從請(qǐng)求的什么地方來(lái)獲得參數(shù)(從URL中獲取UserName,從Body中獲取enrollment),對(duì)于enrollment對(duì)象來(lái)說(shuō)只要包含一個(gè)日期即可(詳情參看系列數(shù)據(jù)庫(kù)及模型的構(gòu)建:http://www.survivalescaperooms.com/fzrain/p/3491804.html),同時(shí)我們要發(fā)送“courseId”以及“UserName”。

下面測(cè)試一下我們的Post方法:我們打算為“TaiseerJoudeh”選擇CourseId為5的課程:

image

在之前已經(jīng)介紹過(guò),我們使用http狀態(tài)碼來(lái)響應(yīng)請(qǐng)求的不同結(jié)果(從這次開(kāi)始看的朋友可以參考:http://www.survivalescaperooms.com/fzrain/p/3520442.html),請(qǐng)求成功則返回201(Resource Created),如果該選課記錄已存在則返回304(Not modified)

總結(jié)

對(duì)于資源間的關(guān)聯(lián)就這么點(diǎn)到為止了,具體的應(yīng)用在以后慢慢感悟了。對(duì)于之前給出的Get方法,有一個(gè)明顯的瑕疵:對(duì)于大量的數(shù)據(jù),服務(wù)器會(huì)全部返回給客戶端,這是非常不好的,那么下一章我們就來(lái)實(shí)現(xiàn)分頁(yè)

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


發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 蓝山县| 九江县| 郁南县| 铜鼓县| 清河县| 建水县| 安顺市| 广宁县| 德惠市| 那曲县| 新密市| 金堂县| 江安县| 翼城县| 惠来县| 霍州市| 繁昌县| 武隆县| 铜川市| 石河子市| 望江县| 名山县| 苍山县| 新田县| 绥滨县| 阜康市| 陆河县| 连城县| 万安县| 阆中市| 资兴市| 林西县| 山阳县| 富阳市| 金川县| 玛沁县| 兴义市| 汤阴县| 康平县| 秦皇岛市| 大丰市|