# 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
By clicking below, you agree to our
terms of service
.
Sign in via Facebook
Sign in via Twitter
Sign in via GitHub
Sign in via Dropbox
Sign in with Wallet
Wallet (
)
Connect another wallet
New to HackMD?
Sign up