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?










留言

這個網誌中的熱門文章

SAP物料主數據(Material Master Data)

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

外貿Payment Term 付款條件(方式)常見的英文縮寫與定義