---
# System prepended metadata

title: 三之 1 、 API - 介面很重要 !
tags: [Lidemy心得, 進度筆記, 2020八月第二週, NET101]

---

# 三之 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)

---