# HTTP (HyperText Transfer Protocol) ## HTTP 介紹 * 超文本傳輸協議,主要是架構於 [TCP / IP](https://notfalse.net/7/three-way-handshake)之上的<font color="#f00">應用層</font>,為<font color="#f00">無狀態</font>的請求回應通訊協定。  * 常使用在與`Web`瀏覽器和網站服務器之間的傳遞訊息(以明文方式發送內容,不提供任何方式的資料加密) * 傳輸數據包含: * `HTML`文件 * 圖片文件 * 查詢結果的超文本格式 * 特性: * 簡單快速: 客戶向服務器請求服務時,只需傳送請求方法和路徑,由於`HTTP`協議簡單,使得`HTTP`服務器的程序規模小,因而通信速度很快 * 靈活性: `HTTP`允許傳送任意類型的資料種類,傳送類型由`Content-Type`決定 * 無連接: 每次連結只處理一個請求,服務端處理完客戶的請求,並收到客戶的回應後,即斷開連接,以節省傳輸時間 * HTTPS 介紹 * 解決`HTTP`不安全特性 - 為了保證這些隱私資料能加密傳輸,讓`HTTP`運行在安全的[SSL/TLS](https://ithelp.ithome.com.tw/articles/10219106)協議上,即`HTTPS = HTTP + SSL/TSL`通過`SSL`來驗證服務器的身分,並為瀏覽器和服務器之間的通訊進行加密。 * 流程:   ## 區別 * HTTP * `HTTP`協議傳輸是明文,並不安全 * 預設 80 port * 性能較好 * HTTPS * `HTTPS`是`HTTP`的安全版本 * `HTTPS`使用`SSL/TSL`協議進行了加密處理,相對安全 * 預設 443 port * 需設計加密以及多次握手,性能方面不如`HTTP` * 須取得`SSL`憑證,要錢 ## HTTP 冪等性(idempotent) * `idempotent`是`HTTP`方法的屬性,表示不管執行多少次操作請求,都將產生相同的結果 * `GET`(讀取):具有冪等性,相同的查詢請求,不管查詢幾次都應該得到相同的結果 * `POST`(新增):不具冪等性,相同的建立請求,每次執行,都會建立一個新的資料 * `PUT`(修改整份文件):具冪等性,每次執行更新請求,都是使用同樣的資料覆蓋指定的資料,所以結果不變 * `PATCH`(修改幾個欄位):不具冪等性。像是有個欄位隨著調用次數在變化的 * `DELETE`(刪除):具冪等性,刪除資料後,無論重複多少次刪除,也不會改變結果 ## HTTP API 版本控制 * 不是所有用戶都會使用最新版本的API,而業務邏輯又是多變的,所以新版本發布時,需要確保向下相容的問題。有以下三種設定方式 * url path: http://api.example.com/v1/resources * header: * Accept-Version ``` Accept: application/vnd.example.v1+json Accept: application/vnd.example+json;version=1.0 ``` * Api-Version: v1 * query parameter: http://api.example.com/resources?version=1 * Media Type Versioning: * example ``` // Request GET /resources Accept: application/vnd.example-v1+json ``` ``` // Response HTTP/1.1 200 OK Content-Type: application/vnd.example-v1+json { "data": [ { "id": 1, "name": "Resource 1" }, { "id": 2, "name": "Resource 2" } ] } ``` ``` // 當客戶需要使用不同版號的 API 時,可以改變 Accept header 來達成目的 // Request GET /resources Accept: application/vnd.example-v2+json ``` ``` // 當客戶需要使用不同版號的 API 時,可以改變 Accept header 來達成目的 // Response HTTP/1.1 200 OK Content-Type: application/vnd.example-v2+json { "data": [ { "id": 1, "title": "Resource 1", "description": "Description of Resource 1" }, { "id": 2, "title": "Resource 2", "description": "Description of Resource 2" } ] } ``` ## RESTful API - Richardson成熟模型 * 介紹: 為一個`API`設計指南,提供完整且易於遵循的`API`設計方法。它涵蓋了`API`設計的四個層級 * Level 0: 使用一個`URL`和一個`HTTP`方法,來處理各種請求 * 只使用 [POST] /message,來做到查詢某個訊息、查詢全部訊息、刪除訊息、修改訊息等 * Level 1: 使用多個`URL`和一個`HTTP`方法。各個URL對應要處理的需求 * 使用 [POST] /show_message取得全部訊息、[POST] /create_message新增訊息、[POST] /update_message修改訊息等 * Level 2: 使用多個`URL`和多個`HTTP`方法,並使用`HTTP`回應的`status code`來代表操作結果 * 使用 [GET] /messages取得全部訊息、[POST] /messages新增訊息、[PATCH] /messages/1修改指定訊息等 * HAL * [連結1](https://en.wikipedia.org/wiki/Hypertext_Application_Language) * [連結2](https://cloud.tencent.com/developer/article/1675442) * `API`設定不一定只有`RESTful`或`soap` * data representation * 一個`HAL`的回應 ``` {"_embedded": { "messageList": [{ "text": "msg1", "_links": { "self": { "href": "http://localhost:8080/messages/1"}}}]}, "_links": { "self": {"href": "http://localhost:8080/messages"} } } ``` * [HATEOAS](https://zh.wikipedia.org/zh-tw/HATEOAS) * Level 3: 更進一步的約束`Level 2`,支援`HATEOAS`(Hypermedia As The Engine Of Application State),類似`HTML`頁面連結,在回傳結果中增加`Hypermedia`(超連結)和動作說明,來代表下一步可以做哪些操作 * 當我們帳戶登入後,可以有存錢、領錢、轉帳、關閉,4種動作 ``` // Request [GET] /account/12345 HTTP/1.1 Accept: application/xml // Response HTTP/1.1 200 OK Content-Type: application/xml <?xml version="1.0"?> <account> <account_ID>12345</account_ID> <link rel="deposit" href="http://xxx/account/12345/deposit" /> <link rel="withdraw" href="http://xxx/account/12345/withdraw" /> <link rel="transfer" href="http://xxx/account/12345/transfer" /> <link rel="close" href="http://xxx/account/12345/close" /> </account> ``` ### 前端 Level 3 串接 [參考網址1](https://notfalse.net/33/http1_1) [參考網址2](https://vue3js.cn/interview/http/HTTP_HTTPS.html#%E4%B8%80%E3%80%81http) [參考網址3](https://www.ithome.com.tw/voice/128528) [參考網址4](https://hackmd.io/saHgyr0MToW7jyQi4d0FBA) [Restful API](https://hackmd.io/@monkenWu/Sk9Q5VoV4/https%3A%2F%2Fhackmd.io%2F%40gen6UjQISdy0QDN62cYPYQ%2FHJh9zOE7V?type=book) [GitHub level 3 restful API 範例](https://docs.github.com/en/rest/overview/resources-in-the-rest-api?apiVersion=2022-11-28) 資料來源 - NTchMB
×
Sign in
Email
Password
Forgot password
or
Sign in via Google
Sign in via Facebook
Sign in via X(Twitter)
Sign in via GitHub
Sign in via Dropbox
Sign in with Wallet
Wallet (
)
Connect another wallet
Continue with a different method
New to HackMD?
Sign up
By signing in, you agree to our
terms of service
.