1. 程式人生 > >使用ASP.NET Web Api構建基於REST風格的服務實戰系列教程【三】——Web Api入門

使用ASP.NET Web Api構建基於REST風格的服務實戰系列教程【三】——Web Api入門

前言

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

Action HTTP Verb Relative URI
獲取所有課程資訊 GET /api/courses
根據某個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

第一步:建立Web Api專案

右擊解決方案->新增新建專案

image

下一步:

image

點選確定

第二步:配置第一個路由

在建立好專案之後,我們可以在App_Start資料夾下看到“WebApiConfig”類。這個類就是用來配置路由資訊的,這個類最終會在“Global.asax”的Application_Start()方法中被呼叫,後面我們會在這個這個類裡面配置多條路由資訊。

配置第一個路由:

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

分析一下上面這段程式碼:我們建立了一個Courses的路由規則,這個路由模板會匹配到“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類似),首先,建立Controller——右擊Controller資料夾->新建項->控制器

然後出現下面視窗:

image

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

開啟剛才建立的Controller,可以看到我們建立的類繼承自“ApiController”。同時對於這個類的類名必須是“CoursesController”,因為在Web Api中預設的控制器選擇方式是尋找所有繼承自“ApiController”類並且這個類是以“Courses”開頭(這是在我們的路由規則中配置的)的控制器。

第四步:在Controller中新增Action

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

方法的選擇是智慧的,如果我們建立了2個方法Get()和GetCourse(int id),假設我們傳送一個GET請求並且URI是“/api/courses/5”,那麼“GetCourse(int id)”方法就會被選擇執行,這是因為方法是以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);
        }
     }
複製程式碼

當我們建立一個Get請求並且URI是“http://localhost:{your_port}/api/courses”時候,Get()方法會被選擇呼叫,下面是相應的部分程式碼:

複製程式碼
[
    {
        "Id": 1,
        "Name": "History Teaching Methods 1",
        "Duration": 3,
        "Description": "The course will talk in depth about: History Teaching Methods 1",
        "CourseTutor": {
            "Courses": [],
            "Id": 1,
            "Email": "[email protected]",
            "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": []
    },
複製程式碼

如果你傳送一個Get請求並且URI是“http://localhost:{your_port}/api/courses/5”。那麼GetCourse(int id)將會被選擇呼叫執行。但是很遺憾在呼叫這個方法之後就會產生一個異常,這個異常資訊簡單來說就是“序列化物件的時候出現了迴圈依賴”,換句話說就是物件間迴圈引用(Course>Enrollment>Course>Enrollment>etc…)

總結

到目前為止我們已經讓Web Api跑起來了,但仍然有很多不足之處:

   返回物件時出現迴圈依賴,可以通過模型工廠模式解決。

   我們返回了領域模型中所有的欄位給客戶端,然而有一些敏感資訊不應該返回(例如:password欄位),解決方案:模型工廠模式

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

   對於返回單個資源,我們應當返回相應的狀態碼(例如:成功200,資源未找到404等),解決方案:HttpResponseMessage物件

  在每個方法裡我們都例項化了一個repository,這個物件包含了一些昂貴的操作(例如:資料庫連線),解決方案:依賴注入模式

  對於返回的Json物件格式是以“帕斯卡”風格的(例如“FirstName”),然而我們的Api有很大的可能被帶有Javascript的客戶端消費,對於JS開發者來說可能更適合“駝峰”風格(例如”firstName”)的資料。解決方案:配置Json格式。

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

相關推薦

使用ASP.NET Web Api構建基於REST風格服務實戰系列教程——Web Api入門

前言 經過前2節的介紹,我們已經把資料訪問層搭建好了,從本章開始就是Web Api部分了。在正式開始之前,再一次回顧一下Web Api的應用場景:Web Api可以與 MVC,WebForm結合使用,也可以作為一個單獨的Web服務。在正式討論Web Api的配置以及如何構造我們的URI來消費資源之前,我

為什麼 web 開發人員需要遷移到. NET Core, 並使用 ASP.NET Core MVC 構建 web 和 webservice/API

2018 .NET開發者調查報告: .NET Core 是怎麼樣的狀態,這裡我們看到了還有非常多的.net開發人員還在觀望,本文給大家一個建議。這僅代表我的個人意見, 我有充分的理由推薦.net 程式設計師使用. net core而不是. net Framework。有些人可能不同意我的觀點, 但是分享想法和

構建基於restWeb服務

構建的rest的Web服務所要實現的功能   構建一個接受HTTP GET請求的服務,如下: http://localhost:8080/greeting   greeting響應的json資料格式如下: {"id":1,"content":"He

基於ASP.NET WebAPI OWIN實現Self-Host項目實戰

hosting 知識 工作 develop plist 簡單 eba 直接 sock 引用 寄宿ASP.NET Web API 不一定需要IIS 的支持,我們可以采用Self Host 的方式使用任意類型的應用程序(控制臺、Windows Forms 應用、WPF 應

一起學ASP.NET Core 2.0學習筆記(二): ef core2.0 及mysql provider 、Fluent API相關配置及遷移

upd order rac option 包管理 rtl code create .net core 不得不說微軟的技術叠代還是很快的,上了微軟的船就得跟著她走下去,前文一起學ASP.NET Core 2.0學習筆記(一): CentOS下 .net core2 s

Asp.Net Core 使用Quartz基於界面畫接口管理做定時任務

進程終止 val rom ota exc 條件判斷 enume 支持 out 今天抽出一點點時間來造一個小輪子,是關於定時任務這塊的。 這篇文章主要從一下幾點介紹: 創建數據庫管理表 創建web項目 引入quarzt nuget 包 寫具體配置操作,實現定

[外包]!采用asp.net core 快速構建小型創業公司後臺管理系統()

bus issues model nco mage oop 推出 兩個 options 接著上一章節繼續嘮嘮 本章主要說一下Redis Redis操作優化 一.基礎類的配置工作   1.我想信許多人(許多neter人)操作redis依然用的是StackExc

[外包]!採用asp.net core 快速構建小型創業公司後臺管理系統()

接著上一章節繼續嘮嘮 本章主要說一下Redis Redis操作優化 一.基礎類的配置工作   1.我想信許多人(許多neter人)操作redis依然用的是StackExchange.Redis,這個neget包,並沒有用國內現在一些大佬們推出了包      RedisOptions主要是

[外包]!採用asp.net core 快速構建小型創業公司後臺管理系統(四.Log4Net的簡單配置)

接著上一章繼續嘮 這一章主要說一下 Log4Net在我專案裡的配置, 另外群裡有人說serilog是最好用的,這個我也用過,感覺就那樣吧,以前還自己寫log 一.基礎配置類      infrastructure下直接一個Log4Net配置檔案   程式碼如下:    ///

[外包]!採用asp.net core 快速構建小型創業公司後臺管理系統(四.quartz 簡單配置使用)

上一章介紹了log4net的簡單配置,這一章介紹一下quartz的簡單使用,下一章介紹一下我得許可權使用,然後就結束 本章主要介紹: quartz在asp.net core中的使用 這個專案雖小,但是及其容易擴充套件,後面的業務直接能丟進來,使其更加豐富 廢話不說開始介紹 一.基礎類配置

[外包]!採用asp.net core 快速構建小型創業公司後臺管理系統(六.結語)

到這裡就結束了,真的結束了,原始碼會在文末分享! 另外錄了兩個視訊,對這個系統進行了演示! 做有意義的事情,原此生無悔! 視訊地址:使用asp.net core 快速構建許可權管理模組1  使用asp.net core 快速構建許可權管理模組2   原始碼地址: https:

如何在ASP.NET 5上搭建基於TypeScript的Angular2專案

一、前言 就在上月,公司的一個同事建議當前的前端全面改用AngularJs進行開發,而我們採用的就是ASP.NET 5專案,原本我的計劃是採用TypeScript直接進行Angular2開發。所以借用這段時間來寫下如何在ASP.NET 5下搭建基於TypeScript的Angualr2的專案,下面我們就進入

ASP.NET MVC 5實現基於Quartz.net 的任務排程管理平臺(一)

任務管理平臺 系統簡介 Quartz.net是一個開源的任務排程工具,相當於資料庫中的 Job、Windows 的計劃任務、Unix/Linux 下的 Cron,但 Quartz 可以把排程控制的更精細,對任務排程的領域問題進行了高度的抽象,實現作業的靈

基於rest風格對Neo4j進行呼叫訪問之———RestTemplate

1.RestTemplate簡介 這個是spring 基於 web client 封裝的類,提供了很多基於rest 訪問的介面方法,極其好用。 2.程式碼實現 package neo4j.action; import com.alibaba.fa

ASP.NET MVC 5 實現基於Quartz.net 的任務排程管理平臺(四)(完)

CREATE DATABASE [TaskManager] ON PRIMARY ( NAME = N'TaskManager', FILENAME = N'C:\Program Files\Microsoft SQL Server\MSSQL10.MSSQLSERVER\MSSQL\DATA\TaskM

win7 2008 尚未在 Web 伺服器上註冊ASP.NET 4.0。為了使網站正確執行,可能需要手動將 Web 伺服器配置為使用 ASP.NET 4.0,按 F1 可瞭解更多詳細資訊。

win7,vs2010建立.NetFramework 4框架下的Asp.Net空網站。系統提示 “尚未在 Web 伺服器上註冊ASP.NET 4.0。為了使網站正確執行,可能需要手動將 Web 伺服器配置為使用 ASP.NET 4.0,按 F1 可瞭解更多詳細資訊。” 查閱

asp.net core 自定義基於 HttpContext 的 Serilog Enricher

asp.net core 自定義基於 HttpContext 的 Serilog Enricher Intro 通過 HttpContext 我們可以拿到很多有用的資訊,比如 Path/QueryString/RequestHeader 等請求資訊, StatusCode/ResponseHeader 等響應

ASP.NET Core中建立基於Quartz.NET託管服務輕鬆實現作業排程

在這篇文章中,我將介紹如何使用[ASP.NET Core託管服務](https://docs.microsoft.com/en-us/aspnet/core/fundamentals/host/hosted-services?view=aspnetcore-3.1)執行Quartz.NET作業。這樣的好處是我

Asp.net Core 3.1基於AspectCore實現AOP,實現事務、快取攔截器

最近想給我的框架加一種功能,就是比如給一個方法加一個事務的特性Attribute,那這個方法就會啟用事務處理。給一個方法加一個快取特性,那這個方法就會進行快取。 這個也是網上說的面向切面程式設計AOP。 AOP的概念也很好理解,跟中介軟體差不多,說白了,就是我可以任意地在方法的前面或後面新增程式碼,這很適合用

ASP.NET Core 網站發布到Linux服務器(轉)

asp.net list oot module func iis 春天 window comment 出處;ASP.NET Core 網站發布到Linux服務器 長期以來,使用.NET開發的應用只能運行在Windows平臺上面,而目前國內蓬勃發展的互聯網公司由於成本的考慮