ASP.NET WebAPI2第001天_從一個最乾淨的專案進行Web API專案建置與開發_Rest跟SOAP比較


在比較Rest及SOAP前
先介紹SOA 全稱為 Service Oriented Architecture(服務導向架構)
提倡將不同應用程式的業務功能封裝成「服務」並Host起來,通常以接口和契約的形式暴露並提供給外界應用訪問(通過資料交換),達到不同系統可重用的目的。
主要用於解決技術不通用的問題,SOA可針對各廠商、產品與技術提供獨立介面供彼此存取只要有共通格式。


Web API 其實跟WCF、Web Service(.asmx)
是類似概念(不顯示畫面的網頁,著重後端業務及資料存取處理)
較常見運用是for 異質系統(不同程式語言)之間資料交換溝通、或是共用介面調用的使用。
藉此來達到不同作業系統、終端(手機、電腦、平板)的可重複使用的公用接口。
(例:即便你是Linux系統也可以對Windows系統 MS SQL資料做存取動作)


Web Service (Web API ,WCF,WebService .asmx )跟WebSite最大差異就在於對應的請求終端不同
WebSite面對的是人(User),而Web Servie面對的可能是另一台主機(其他終端)上的應用程式
因此Web Service 著重點不在UI呈現!!!!!!!
Web Service 跟 Web API 還有一個差異在於
Web API 是偏於端點對端點在進行發收互動,Web Service則是比較繁瑣要兩邊都喬好你我都要是SOAP的規格才能有來往。







Web API所採用的REST 跟 Web Service 的 SOAP協議最大差異在於就
資源管理狀態上和所支持的資料格式,
還有一個是通訊協議(SOAP)一個是一種架構風格(REST)。


REST服務屬於總是無狀態的而且格式
可以支援JSON、XML、HTML、txt...等等多種資料格式。
REST請求方法僅支持HTTP的一系列標準方法(GET/POST/PUT/DELETE)
會回傳人眼可直接讀懂的資料內容(較容易理解)
效能較SOAP好(通常用JSON較小的資料格式)
調用方式直接透過URL Path
REST比較像是明信片,在發送上會更便宜更迅速也很容易直接讀取。

SOAP是可有狀態的,可無狀態的,只支援XML形式,自己已先定義
好本身的資料格式(根據WSDL跟UDDI),有對應標題、正文,可選擇服務方法。
可支援較多種通訊協議,除了HTTP外還有支援HTTPS、TCP、UDP、SMTP,
具有協議中立性。
請求方法僅支持HTTP POST
不會直接回傳人眼可立即讀懂的內容
效能較REST差(XML格式資料量較大)
調用方式是透過觸發RPC Method
SOAP則較像信封,信封會需要較多額外處理程序打開或封裝信件內容
(備註:WSDL:Web Services Description Language)
(備註:UDDI: Universal Description Discovery and Integration)
https://www.w3.org/TR/soap/















Web APIeb API相關術語:

Restful 風格的API(Rest API , RESTful Web Services):
Rest 是英文 Representational State Transfer(表現層狀態轉換)
的縮寫,是Roy Thomas Fielding博士於2000年在他的博士論文中提出來的
一種全球資訊網軟體架構風格,不是一種protocol!!!,目的是便於
不同軟體/程式在Internet中可互相傳遞資訊。
一般有四種方法:
GET(查詢)
POST(新增)
PUT(更新)
DELETE(刪除)

摘自:https://www.codecompiled.com/mvc/asp-net-webapi/
也漸漸有更多開發團隊採用此標準進行開發,是未來的趨勢。



Router(路由):
一整個Web API 的入口,當訪問特定某資源就是透過路由
來映射至對應資源URL的,也就是透過URL來獲得資源。
->預設的路由格式: "api/{controller}/{action}/{id}"

action就是一些方法名稱,id則是參數。



Controller(控制器) 跟 Action(動作):
Controller下會包刮很多種Action(也就是一些方法或控制流程)。
MVC的控制器跟Web API的控制器是不太相同的!!!!
差異1.繼承的 Class不同
最大差異在於繼承自哪個Class
->Web API的 XXXController 繼承自ApiController
->MVC的 XXXController繼承自 Controller (實作IController 介面類型物件)
差異2.控制器的Action回傳的狀態
MVC -> 偏向回傳View(畫面)
Web API ->偏向回傳給前端的資料值或者控制流程





Web API Controller實際程式碼:
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Net.Http;
using System.Web.Http;

namespace TestWeb.WebApi.Controllers
{
    /// <summary>
    /// 標準的restful風格的API,Class名/Method名
    /// </summary>
    public class ValuesController : ApiController
    {
        // GET api/values
        /// <summary>
        /// 
        /// </summary>
        /// <returns></returns>
        public IEnumerable<string> Get()
        {
            return new string[] { "value1", "value2" };
        }

        // GET api/values/5
        /// <summary>
        /// 
        /// </summary>
        /// <param name="id"></param>
        /// <returns></returns>
        public string Get(int id)
        {
            return "value";
        }

        // POST api/values
        /// <summary>
        /// 
        /// </summary>
        /// <param name="value"></param>
        public void Post([FromBody]string value)
        {
        }

        // PUT api/values/5
        /// <summary>
        /// 
        /// </summary>
        /// <param name="id"></param>
        /// <param name="value"></param>
        public void Put([FromUri]int id, [FromBody]string value)
        {
        }

        // DELETE api/values/5
        /// <summary>
        /// 
        /// </summary>
        /// <param name="id"></param>
        public void Delete(int id)
        {
        }
    }
}

MVC的Controller實際程式碼:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;

namespace MVCExampleProject.Controllers
{
    public class HomeController : Controller
    {
        public ActionResult Index()
        {
            return View();
        }

        public ActionResult About()
        {
            ViewBag.Message = "Your application description page.";

            return View();
        }

        public ActionResult Contact()
        {
            ViewBag.Message = "Your contact page.";

            return View();
        }
    }
}





從空專案來瞭解 asp.net web api
(此範本是不注重介面呈現,著重於後端資料業務處裡)

要開始一個Web API 專案有兩種方法,在不同時機會需要採取相應
的動作,無優劣勢情況來看要選哪種方式來創建或添加。


方法1.自動專案建立法
直接透過專案類型來新增Web API 專案

選擇新增 Web 應用程式後(這裡用vs2017)
 選擇空白->勾選Web API
 就完成

我們可以看到有



方法2.人工手動添加法
透過事後添加方式(比較多步驟)

這次我只建立一個Web空專案


這裡可以比較空專案跟Web API專案的差異

對專案右鍵開啟 Nuget 套件管理

 輸入 Web API後
選擇 Microsoft.AspNet.WebApi 按接受
 一些相關參考也會自動被配置好


到這裡都只是手動作相關專案參考前置配置處理而已
一個完整的Web API Project會需要如下目錄跟檔案
因此這裡要
自行手動新增App_Start 目錄還要自己
新增WebApiConfig.cs的 Class檔案(檔名不能改喔,會在Global.asax中被調用)

這裡我就直接Copy剛剛新增的Web API專案自動產生的程式貼入

記得using System.Web.Http;
引入 Web.Http 命名空間避免有錯誤

自己加入需要的Folder (Controllers 跟 Models)




接著要新增Global.asax
右鍵 新增 -> Global Application Class
Default會產生一系列不必要的HTTP生命週期相關函數


Code


 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Security;
using System.Web.SessionState;

namespace WebApp
{
    public class Global : System.Web.HttpApplication
    {

        protected void Application_Start(object sender, EventArgs e)
        {

        }

        protected void Session_Start(object sender, EventArgs e)
        {

        }

        protected void Application_BeginRequest(object sender, EventArgs e)
        {

        }

        protected void Application_AuthenticateRequest(object sender, EventArgs e)
        {

        }

        protected void Application_Error(object sender, EventArgs e)
        {

        }

        protected void Session_End(object sender, EventArgs e)
        {

        }

        protected void Application_End(object sender, EventArgs e)
        {

        }
    }
}

這裡我們就只保留Application_Start
一個方法就好了



到此我們基本上掌握了Web API 專案架構和基礎知識了



Ref Link:
https://docs.microsoft.com/zh-tw/aspnet/web-api/overview/getting-started-with-aspnet-web-api/tutorial-your-first-web-api

淺談Web Service(一) - SOA(Service-Oriented Architecture)

What are the differences between REST and SOAP?

Are both REST and SOAP an implementation of SOA?










留言

這個網誌中的熱門文章

何謂淨重(Net Weight)、皮重(Tare Weight)與毛重(Gross Weight)

Architecture(架構) 和 Framework(框架) 有何不同?_軟體設計前的事前規劃的藍圖概念

經得起原始碼資安弱點掃描的程式設計習慣培養(五)_Missing HSTS Header