全名為 Application Programming Interface,中文翻譯為「應用程式介面」
簡單來說就是方便溝通、交換資料的管道。
怎麼說方便溝通呢? 我自己覺得中國的翻譯:「接口」,比較容易想像。
就像是把家裡的 插頭 (開發者) 插進 插座(API) 就 有電(資料交換)。
而 API 有分很多種:
以網頁用的 Web API 來舉例,就像是對方定義好了插座的規格,我們只要照著規格、把形狀合適的插頭插上去,就可以得到我要的資料,而你不會知道資料是怎麼來的,就像你不知道電是怎麼傳過來的( 或許你知道 )
你只是呼叫 function 加上參數,就會得到一個結果,中間的商業邏輯與資料篩選是提供 API 的 Server 端來處理。
一般來說,Web API 就是只透過 HTTP 協定的 API,有幾個常見的應用:
以網站來說,最常用的應該是登入系統,現在不管哪個網站,在會員登入頁,大部分都會有 Facebook 跟 Google 登入按鈕,這麼做對開發者、用戶、甚至是供應商,都是有利的狀況:
參考資料:
現代 API 有一大部分都是走 RESTful 設計風格。
注意: 是一種廣泛流行的 API 設計規範、不是規定
簡單設計一個非 RESTful 的 API,功能在於操作文章,可以看得出來 「 動詞是寫在 URL 」上。
GET
+ /Get_allArticle
: 獲取 所有文章GET
+ /Get_Article/5
: 獲取 id 為 5
的文章POST
+ /Create_Article
: 新增 文章POST
+ /Delete_Article/5
: 刪除 id 為 5
的文章如果內容要做得非常 RESTful ,其實還滿嚴格的,我還沒深入研究。
但如果只是想要淺略了解的話,核心在於 request 要符合 「 語易化的動詞 Method 」 + 「 名詞 URL 」的格式,例如:
GET
+ /articles
: 獲取 所有文章GET
+ /articles/5
: 獲取 id 為 5
的文章POST
+ /articles
: 新增 文章DELETE
+ /articles/5
: 刪除 id 為 5
的文章PATCH
+ /articles/5
: 修改 id 為 5
的文章部分內容PUT
+ /articles/5
: 更新 id 為 5
的文章全部內容 ( 換句話說,就是覆蓋 )Huli 在課程舉了一個我認為很好理解的例子。
「 就像你寫網頁的時候,你也可以整個 html 檔案全部都用 div
標籤,但使用更有語意化的標籤( 例如section
、article
),可以更好從結構裡看出內容的作用。 」
也就是說,就算你只用 GET
跟 POST
也可以達到以上功能,但充份善用 HTTP Method 可以讓開發者更快速地了解如何使用此 API,也符合 CRUD 原則的、分別是 Create (Post)、Read (Get)、Update (Put)、Delete (Delete),我們就把這種風格稱為 RESTful API。
常用的資料格式有兩種: XML、JSON
以前傳資料的格式,現代開發比較少用
比起 XML 更輕量,為現代最普遍、常用的資料格式。
key
值必須要用雙引號 "key"
包起來[ ]
) 以及 物件 ( 用大括號 { }
)Vaule
值沒有辦法放 function所以當我們發出一個 request,收到資料格式為 JSON 的 response 要怎麼處理呢?
一樣用 reqres.in 的 API 為例,請看以下程式碼:
const request = require('request');
request(`https://reqres.in/api/users/5`, function (error, response, body) {
console.log('原始格式,JSON 格式的字串----------');
console.log(body);
console.log('轉成 JS 物件--------------------');
console.log(JSON.parse(body));
如果只是把 response 的 body
印出來,會發現是「 JSON 格式 」的 「 字串 」,所以用內建的函式 JSON.parse(<JSON>)
做處理,就會轉成「 JS 物件 」。
反過來說,如果想要把 「 JS 物件 」轉成「 JSON 格式的字串 」,可以用:
JSON.stringify( <object> )
curl
( 以下內容完全參考至這篇文章: Linux Curl Command 指令與基本操作入門教學,詳細又好懂,感謝! )
隨便看一個 Web API 文件,一定都會看到上面用 curl
示範如何發出正確的 request,因為此做法最簡單、沒有任何門檻,只要在終端機 ( Terminal ) 輸入指令就可以發 request!
雖然很簡單使用,但 curl 可是很強大的,支援發 HTTP request 、下載及上傳檔案的功能,基本格式為:
curl [options] [URL...]
GET
方法簡單示範一下,用 curl
發 request 到 google 首頁
curl http://www.google.com
google.html
這個檔案: curl http://www.google.com > google.html
-I
--head
只需要 response header
curl -I http://www.google.com
-o
O
--output
下載 response 到新檔案,假設為 google.html
curl -o google.html http://www.google.com
,其效果等同: curl http://www.google.com > google.html
-O
O
--remote-name
下載指定網址的檔案內容googlelogo_color_272x92dp.png
curl -O https://www.google.com/images/branding/googlelogo/2x/googlelogo_color_272x92dp.png
-L
301 / 302
轉址後的網址curl -L google.com
-X
--request
使用 HTTP Method 來發出 request,後面要加上 GET
/POST
/PUT
/DELETE
/PATCH
curl -X GET "http://www.example.com/api/resources
-H
--header
設定 request 要攜帶的 header
curl -H http://www.example.com "X-TestHeader1:111"
-s
--silent
靜音模式,不輸出任何東西curl -X GET "http://www.example.com/api/resources
$ curl -X POST -H "Content-Type: application/json" -d '{"status" : false, "name" : "Jack"}' "http://www.example.com/api/resources"
curl -X DELETE "http://www.example.com/api/resources/1
( 以上內容大部分是 程式導師實驗計畫第三期 的學習筆記,如有錯誤歡迎糾正,非常感謝 🤓 )
Written on May 8th, 2019 by Yakim shu