---
# System prepended metadata

title: 筆記｜第八堂：RESTful API 整合開發
tags: [學習筆記, JavaScript]

---

`#JavaScript` `#六角前端課程` `#學習筆記` `#骨力走傱`

## API 與 RESTful API
### API
> API（Application Programming Interface，應用程式介面）是一組定義不同軟體系統之間如何互動的規則和協定。

> 簡單來說，**API 的主要目的是調用某些功能或服務，而不需要重新去寫這些功能。這使得軟體開發變得更加高效**，並且能夠利用其他系統或服務提供的功能。

> 舉例，你（使用者）去餐廳用餐，告訴服務員（API）你想吃什麼，接著服務生（API）會轉達給廚師（後台系統），廚師（後台系統）會幫你處理好菜色，再透過服務員（API）將餐點端給你（使用者）。

![VS---14’33”](https://hackmd.io/_uploads/SJkOtAB-Zg.jpg)

### RESTful API
> RESTful API 是一種基於 HTTP 協議的 API 設計風格，通過簡單的 URL 和 HTTP 方法來操作資源。

> 其核心思想是，每一個 URL 都代表一個資源，而不同的 HTTP 方法（如 GET、POST、PUT、DELETE）用來對這些資源進行不同的操作。
> * `GET` /users：取得用戶的資料。
> * `GET` /users/{id}：取得特定用戶的資料。
> * `POST` /users：新增新的用戶資料。
> * `PUT` /users/{id}：更新特定用戶的資料。
> * `DELETE` /users/{id}：刪除用戶資料。

### 資料來源
* [API串接功能，你不可不知道的網頁技術知識](https://www.lohaslife.cc/post/article-api-knowledge)
* [新手指南：什麼是 RESTful API？](https://realnewbie.com/basic-concent/what-is-restful-api)

## 網址結構
:::info
以 `https://tdx.transportdata.tw/api/basic/v2/Tourism/ScenicSpot/Kaohsiung?%24top=50&%24format=JSON` 為例。
:::
* 到 `?` 號之前的 `https://tdx.transportdata.tw/api/basic/v2/Tourism/ScenicSpot/Kaohsiung` 是網址的主體。
* 使用 `?` 串接參數。
* `top=50`、`format=JSON` 為參數。
* 參數與參數之間使用 `%` 連接。

## 串接 API 的四種種類

| 讀取位置   | 是否需申請帳號 | 資料種類                                               |
| ---------- | -------------- | ------------------------------------------------------ |
| 瀏覽器端   | ❌             | 政府的 Open data。                                     |
| 瀏覽器端   | ✔️             | 沒有高度敏感資料的服務，但需要辨識使用者，且會限流（只能讀取 100 次之類的）。 |
| 後端伺服器 | ❌             | Open data 居多，但該服務不想承受請求壓力。             |
| 後端伺服器 | ✔️             | 高度敏感資料，需要辨識使用者，以最安全的方式取得資料。 | 

若 Response headers 裡面的屬性 `Access-Control-Allow-Origin` 顯示 `*`，表示「允許任何來源」都可以發起跨域請求並讀取回應。

## 常見的審核與請求方法
### API KEY（金鑰）與 Token（令牌）
* 某些 API 需要經過審核才可以串接，因此 API KEY 與 Token 的設計就是審核。
* API KEY 通常用於識別使用者；而 Token 用於授權使用者權限。

### 常見的請求方法
![VS---70’34”](https://hackmd.io/_uploads/SJdY0m_ZZl.jpg)
![VS---72’33”](https://hackmd.io/_uploads/SybKRmu--x.jpg)

## 什麼是 Swagger？
> Swagger 是一間名為 SmartBear Software 的公司，開發出的 REST API 的工具，可以幫助設計、構建、記錄和使用 REST API。

> 能建立清晰明瞭的 REST API 規格文件。

### 資料來源
* [使用 Swagger 自動建立清晰明瞭的 REST API 文件](https://ithelp.ithome.com.tw/articles/10242295)

## 為什麼有些 API 會有 ID 資訊？
* 避免資料撞名，例如身份證號碼。
* [通用唯一辨識碼 UUID](https://zh.wikipedia.org/zh-tw/%E9%80%9A%E7%94%A8%E5%94%AF%E4%B8%80%E8%AF%86%E5%88%AB%E7%A0%81)

## API 實作練習
### 文件
* [API 教學文件](https://chalk-freedom-ec6.notion.site/API-8b5b74eb052b451faf28013d76811fac#7598a1040d4f4c4aab5dec30f621d2b8)
* [API 申請平台](https://livejs-api.hexschool.io/)
* [API 線上測試文件](https://hexschool.github.io/hexschoolliveswagger/)
> 在這裡，前端負責將介面與服務串接起來，但實際上「新增」、「修改」與「刪除」等業務邏輯，是由後端負責的。

### 如何在測試文件中執行 API？
1. 申請 API 路徑。
2. 切換到測試文件，點選任一支 API。
3. 點選 Parameters 旁的 Try it out。
4. 在 api_path 欄位輸入剛剛申請的 API 路徑。
5. 點選下方 Execute，即可收到 Responses 的資料。

### 程式碼
```javascript=
// 組合 API 路徑
// 每支 API 的基本路徑相同
// 可將相同的部分宣告成變數管理
const baseUrl = "https://livejs-api.hexschool.io/api/livejs/v1/customer/";
const apiPath = "eeeee750217";
const productsApiUrl = `${baseUrl}${apiPath}/products`;

// 取得產品列表
function getProducts() {
  axios
    .get(productsApiUrl)
    .then(function (res) {
      console.log(res.data.products);
    })
    .catch(function (err) {
      console.log(err.response.data.message);
    });
};
```