---
# System prepended metadata

title: Ch 01. Web API 設計要素
tags: [Book, Web API 設計原則：API與微服務傳遞價值之道]

---

# Ch 01. Web API 設計要素

:::success
**API 從被設計出來的那刻開始，要以他會是永存且不會消失的來看待**
:::

當一支 API 被廣泛使用後，會很難做大幅度的修改，否則因容易影響到不同的使用者而停擺；而如果 API 設計的草率，則後續維護時可能會發現當初的設計無法被復用，但又因為已經交由使用者使用，而無法輕易修改。

因此在產品規劃階段，就需要重視 API 的設計。

> 一個系統或服務的架構是由各式各樣的設計來組成的，一系列的設計決策會塑造出系統的表現形式及功能。

企業對外開放的 API 代表了企業想傳達的價值，而 API 的特性會表達出該企業在設計系統時所重視的特點

## **Web API 的設計要素**

* 商業能力
* 產品思維
* 開發體驗

### 商業能力

:::info
企業 ***為了獲利或維持市場競爭力的能力***，可以是組織對外或對內所展現出來的能力
對外主要是吸引消費者上門的能力，對內則是對於內部資源的整合等等
:::

三種用來輔助提高自身商業能力的方法：
* 企業自己宣傳
* 外包廠商代為宣傳
* 兩者混和使用

可以將服務內的部分功能交由外包廠商提供，企業就可以專注在強化自己的商業能力，讓自己有更多的心力去作出市場的差異化並提高自己的商業能力

API 可視為數位化後的商業能力，每支 API 都會帶來不同的商業能力

### 產品思維

在 Web API 不成熟的時代，企業間已經有資訊整合的能力，但多是以客製化的方式進行；因此每多服務一個客戶都是一次重複的資源損失，資源無法共享

企業提供的 API 應該要專注在本身所能帶給客戶的價值，讓客戶自行根據 API 的功能去實現他想展現的**商業能力**

:::info
產品化代表減少客製化，API 提供統一標準給所有客戶，在設計階段就納入客戶意見，就能更貼近市場需求，就有機會贏來更多潛在用戶
:::

### 開發者體驗

:::info
用戶體驗 (User Experience, UX) 主要是聚焦在如何滿足客戶使用感受，開發者體驗 (Developer Experience, DX) 是聚焦在提升開發者使用 API 時的體驗
:::

一個好的 API 可以讓開發者更快速簡單的上手，讓他們可以更專心在發展自己的**商業能力**上，甚至讓開發者也願意去推廣給其他人使用；而不好的文件會增加開發者的溝通成本，因此好的文件也可以幫助改善開發者體驗

:::success
API 不對外開放的公司可能會沒什麼感覺，因為對內部的開發者來說，API 做再爛都還是要串，沒討價還價的能力；但如果 API 的受眾是外部使用者，設計不良的 API 就有可能會影響到客戶的使用意願
:::

## **API 設計 = 溝通與交流**

API 的溝通不只是團隊內的溝通，而是對內對外都有，跟不同對象的溝通可以讓我們從不同的角度去設計 API，進而實現貼近市場需求的 API

溝通可以分為3個面向：
* 網路面的溝通 (通訊協定)
* 開發者面的溝通 (需求探索)
* 市場面的溝通 (價值)

### 網路面的溝通

不同的通訊協議會影響 API 的使用場景，因此需要根據 API 的功能或會面對到的效能問題也列入考慮，才能決定出適合的通訊協議

### 開發者面的溝通

在 API 的需求探索及設計階段盡早納入來自開發者的意見，才能實現貼近他們真正需求的 API 設計

### 市場面的溝通

提供開發者 API 所能帶來的價值，以及能幫助他們實現那些目的，使得客戶能使用 API 來實現各自所需的商業價值

## **檢視軟體設計原則**

軟體設計關注的是程式碼的組成架構與通訊，API 設計的基礎原則也是來自軟體設計，但 API 的交流對象更廣泛，不只公司內部的開發者，也包含外部的開發者

* 模組化
* 封裝
* 高內聚低耦合

### 模組化

模組是軟體中的最小單元，由類別、方法等等所構成，也被稱為元件或函式庫；在 Web API 中是用來劃分不同 API 的功能，每支 API 會有分明的功能差異

### 封裝

用於隱藏元件的內部實作細節，在 Web API 來說是指使用者只需要知道如何調用 Web API 而不需要知道內部的實作細節

### 高內聚低耦合

高內聚是一個模組的程式碼只與該模組有相關，而不與其他模組的程式碼相關；低耦合是兩個模組間的程式碼彼此不高度依賴，只透過公開出來的 API 進行溝通

在 Web API 上會將相關度高的 API 集合起來，產生一個服務，並且不會讓外部知道該服務內的 API 是如何調用其他的 API

## **Resource-Based (以資源為基礎的) API 設計**

:::warning
Data Service 需要注意的東西
:::

### 資源 != DB 模型 / 物件模型 / 領域模型

API 所代表的資源及對外丟出去的 Response，不該跟資料庫的資料結構一樣，如果 Response 跟 DB 一樣的話，後續改資料結構或替換 DB 時容易導致 Response 一起受到影響。DB 的資料結構的確可能會影響 API 的資料格式，但 Response 應該始終保持 API 所想表達的意義

也包含了程式碼內部在使用的物件模型或領域模型，跟 DB 模型的問題一樣，應該要盡量避免實作細節或業務細節，指專注在資訊的交換上

* 程式連帶受到影響
    DB 改了需要從最底層一路改到外部的 Response
* 冗餘的互動
    因為一支 API 只能取的一張表的資料，所以要透過多次 API 的往來才能組出複雜查詢的結果
* 資料不一致
    因為每次 API 查詢的時間會有些微落差，所以可能會產生資料不一致的問題 (Dirty Read)
* 資料表的資料對外部使用者來說語意不明
    資料表的資料可能是經過設計，可以幫助查詢等等的，但對於使用者來說，可能不好閱讀
* 機敏資料外洩
    如果沒注意到，可能不小心就把機敏資料跟著一起洩漏了


### Web API 設計原則

1. 設計 API 需要大家一起討論，而不是獨自一人做
2. API 設計是目標導向的，聚焦在目標並確保是有價值的
3. 沒有最好的 API 只有最適合需求的 API
4. API 文件很重要
5. 已做完的 API 不會輕易消失，仔細規劃，後續迭代改進，才能讓 API 穩定又有彈性

###### tags: `Web API 設計原則：API與微服務傳遞價值之道` `Book`