# 三之 1 、 API - 介面很重要 !
###### tags: `NET101` `2020八月第二週` `進度筆記` `Lidemy心得` 8/12
__應用程式介面 (Application Programming Interface) , AKA API 。__
- 介面很重要,透過介面來溝通。
- 電腦透過介面存取。
因此可以分為使用 API 和提供 API:
- 不希望直接被存取資料庫。
- 定義那些資料要被存取。
- 例如: 作業系統提供 API、檔案透過 API 讀取。
- 串接 API = 拿取資料。
- 提供 API 給他人來網站存取資料或是新增資料。
__重點: 透過 API 即可讓雙方交換資料。__
---
# 三之 2 、 API & Web API
###### tags: `NET101` `2020八月第二週` `進度筆記` `Lidemy心得` 8/12
__Web API => HTTP API , 即透過 HTTP 協定的 API , 來交換資料。__
- FaceBook - 圖形API 。
- Twitch API - V5 :
- 可以拿參數 、HTTP API request & response 。
- 串接 API 來拿 request & response 。
- 歐付寶 SDK - 軟體開發套件 (Software Development Kit) , 裡面做好許多的 API ,可以直接使用。
- PokeAPI - 輸入怪物名稱就能拿到例如技能資料之類,有一定資料格式。
- picsum 呼叫圖片的 API 。
- HackerNews API , 幫找網站的結構後做處理,拿到 response 。
---
# 三之 3 、 API 實作
###### tags: `NET101` `2020八月第二週` `進度筆記` `Lidemy心得` 8/13
之前用了 npm 的 library Request , 這次實作以檔案 index.js 的內容來改:
```
const request = require('request');
request(
'https://github.com/Lidemy/mentor-program-4th',
function (error, response, body) {
console.log(response.headers)
// console.log('body', body);
}
);
```
在 https://reqres.in/ 有方便實用的 API ,可提供測試用,我們拿 url: "https://reqres.in/api/users" 來使用:
```
const request = require('request');
request(
'https://reqres.in/api/users',
function (error, response, body) {
console.log(body);
}
);
```
- 這樣就能發一個 request 到 https://reqres.in/api/users , 並且印出 body 。
- 實際用 node.js 執行會有這個 API 返回資料。
## 拿資料
根據 https://reqres.in/ 的 API 格式,要得到 SINGLE USER 的 ID 資料,則要這樣做:
```
Request
/api/users/2
```
因此:
```
const request = require('request');
request(
'https://reqres.in/api/users/2',
function (error, response, body) {
console.log(body);
}
);
```
__印出 response 會發現這資料格式跟物件很相像。__
- 如何完成 API 串接 ?
- 試著讀懂文件並執行。
- 這樣就完成了 API 串接。
---
## 直接在 CLI 打指令 串接 API
以 node.js 指令為例。
- 一般執行指令是 `node index.js` 這樣可以做到上面提到的 API串接。
- 如果想要 `node index.js 2` 就直接拿到 SINGLE USER 的 ID 資料 ?
在 node.js 可以用內建模組 process 引入進來:
```
const request = require('request');
const process = require('process');
console.log(process.argv)
request(
'https://reqres.in/api/users/2',
function (error, reponse, body) {
console.log(body);
}
);
```
- 印出來會是一個 array , 三行綠字。
- 第一行會是 node 的參數。
- 第二行會是 index.js (檔案)的參數。
- 第三行則是所串接的 API 資料,我們要拿的資料。
- argument vector (argv) 能夠執行一個文件達到多行命令的效果,假設 `node process-args.js 參數1 參數2 參數3` 輸出則會是:
0: /usr/local/bin/node
1: /Users/mjr/work/node/process-args.js
2: 參數1
3: 參數2
4: 參數3
- 這個很有用處。假如在 bat 文件這樣寫 node app 127.0.0.1 7001 , 其透過 `.argv [2]` 得到 IP , `argv[3]` 得到連接埠,更方便修改配置。
---
## 直接拿第三個元素
一樣以 index.js 這個檔案為例:
```
const request = require('request');
const process = require('process');
// console.log(process.argv)
request(
'https://reqres.in/api/users/' + process.argv[2],
function (error, reponse, body) {
console.log(body);
}
);
```
然後執行指令 ` node index.js 2` 我們就能拿串接的 API 資料,會拿到 "id": 2 的 SINGLE USER 資料。
- ` node index.js 3` 則會拿到 "id": 3 的 SINGLE USER 資料,以此類推。
---
## 可以用 POST 去新增 USER
一樣以 index.js 這個檔案為例。
參考 [GitHub 技術文件](https://github.com/request/request#forms),來寫 request 的 Forms :
```
const request = require('request');
const process = require('process');
// console.log(process.argv)
request.post(
{
url:'https://reqres.in/api/users/',
form: {
name:'User',
job:'Full'
}
},
function (error, reponse, body) {
console.log(body);
}
);
```
多按幾次 `node index.js` 指令會看到建立每次 id 都不同的 User 資料。
- 主要是接 {form:{key:'value'} , 裡面皆所要串接的 API 。
- 將 url: http://service.com/upload 置換成 https://reqres.in/api/users/ 。
- 第一個參數是物件 `form:{}` , 將 key:'value' 改成 https://reqres.in/api/users/ 所需格式。
- 並不會真的寫入到 https://reqres.in/api/users/ 的資料,只是模擬寫入 response 這樣。
---
參考資料:
[ process.argv命令行參數 ](https://riptutorial.com/zh-TW/node-js/example/10945/process-argv%E5%91%BD%E4%BB%A4%E8%A1%8C%E5%8F%83%E6%95%B8)
[process.argv](http://nodejs.cn/api/process/process_argv.html)
[process.argv与命令行工具](https://juejin.im/post/6844903568365846536)
[引數 (Argument) vs. 參數 (Parameter)](https://notfalse.net/6/arg-vs-param)
[ process.argv 这个有什么用途? ](https://cnodejs.org/topic/515a40836d38277306084809)
---