---
title: 'RESTful API 筆記'
---
RESTful API 筆記
===
RESTful(Representational State Transfer,表徵狀態轉移)API 是一種網絡應用程序的接口設計風格,依賴於HTTP/HTTPS協議。它使用標準的HTTP方法(如GET、POST、PUT、DELETE等)來執行資源的操作。
RESTful API 通常會搭配 HTTP 回應狀態碼(HTTP response status codes)來表示請求的結果。這些狀態碼提供了關於請求是否成功,以及如果不成功,原因何在的重要信息。
核心概念
---
1. 資源(Resource)
- 資源的表現層:資源可以是文本、JSON、XML 或其他格式。
- 統一資源標識符(URI):每個資源都有唯一的URI。例如,/users 可以代表用戶資源。
2. 狀態無關(Stateless)
- 無狀態通信:每次請求都包含所有必要信息。伺服器不保存客戶端的任何請求狀態。
3. 可緩存(Cacheable)
- 提高效率:響應可以被標記為可緩存或不可緩存,減少客戶端-伺服器間的交互。
HTTP方法
---
- GET:獲取資源。
- POST:創建新資源。
- PUT:更新現有資源。
- DELETE:刪除資源。
- PATCH:局部更新資源。
備注: 通常PATCH以及PUT是相同概念,不過爲了數據完整性,基本上都會使用PUT
API 設計的核心原則
---
- 客戶端-伺服器分離:客戶端和伺服器之間的分離使得每部分可以獨立發展。
- 無狀態操作:每次請求都應包含所有必要的信息,伺服器不保存任何客戶端的上下文。
- 可通過網絡緩存提高效能:通過設置緩存策略,可以提高API的效率和性能。
- 統一接口:保持一致的接口設計,使API更容易理解和使用。
- 按需編碼(選用):根據需求提供可執行的代碼或腳本,但這通常不常見。
路由設計的核心原則
---
- 清晰且描述性的URL:使用名詞而非動詞來命名URL,並清楚地表示資源。
- 使用標準HTTP方法:如GET(讀取)、POST(創建)、PUT(更新)、DELETE(刪除)來處理資源。
- 資源層次結構:通過路徑來表達資源之間的層次關係,例如 /users/{id}/posts。
- 統一資源定位:相同的資源應該在所有的操作中保持一致的URI。
- 狀態代碼使用:使用HTTP狀態代碼來表示API操作的結果(如200成功,404未找到,500服務器錯誤等)。
- 過濾、排序和分頁:提供過濾、排序和分頁功能來改善大型數據集的處理。
實際範例
---
以下是一個基於PHP和Laravel框架的RESTful API範例:
```Laravel!=
use Illuminate\Support\Facades\Route;
use App\Http\Controllers\UserController;
// 使用UserController中的方法來處理對應的HTTP請求
Route::get('/users', [UserController::class, 'index']);
Route::post('/users', [UserController::class, 'store']);
Route::get('/users/{id}', [UserController::class, 'show']);
Route::put('/users/{id}', [UserController::class, 'update']);
Route::delete('/users/{id}', [UserController::class, 'destroy']);
```
```Laravel!=
use App\Models\User;
use Illuminate\Http\Request;
use App\Http\Controllers\Controller;
class UserController extends Controller
{
// 獲取所有用戶
public function index()
{
return User::all();
}
// 創建新用戶
public function store(Request $request)
{
$validatedData = $request->validate([
'name' => 'required|max:255',
'email' => 'required|email|unique:users',
'password' => 'required|min:6'
]);
$user = User::create($validatedData);
return response()->json($user, 201);
}
// 獲取單個用戶
public function show($id)
{
return User::findOrFail($id);
}
// 更新用戶
public function update(Request $request, $id)
{
$user = User::findOrFail($id);
$user->update($request->all());
return response()->json($user, 200);
}
// 刪除用戶
public function destroy($id)
{
User::findOrFail($id)->delete();
return response()->json(null, 204);
}
}
```
這些路由對應於不同的HTTP方法和URL,並連接到UserController中的相應方法。每個路由處理特定的API請求:
- GET /users:獲取所有用戶的列表。
- POST /users:創建一個新用戶。
- GET /users/{id}:獲取特定ID的用戶。
- PUT /users/{id}:更新特定ID的用戶。
- DELETE /users/{id}:刪除特定ID的用戶。
在設計API路由時,重要的是要保持路由清晰且符合REST原則,這樣客戶端開發者能夠輕鬆地理解和使用您的API。
總結
---
雖然某些時候在設計API路由的時候往往會使用功能去設計命名(如:`/users/getUsersInfo`),這樣違反的RESTful API的設計理念,所以設計的時候要去思考資料來源。
RESTful API的設計理念在於簡潔和統一,使得API易於理解和使用。這種方法強調資源和其表達,並通過HTTP協議的標準操作來處理這些資源。遵循REST原則的API能夠提供良好的性能、可擴展性和可維護性,同時也簡化了客戶端和服務端的交互。這種設計方式適用於多種不同的應用程序,從簡單的資料存取到複雜的業務邏輯處理。
參考資料:
---
- [API 是什麼? RESTful API 又是什麼?](https://medium.com/itsems-frontend/api-%E6%98%AF%E4%BB%80%E9%BA%BC-restful-api-%E5%8F%88%E6%98%AF%E4%BB%80%E9%BA%BC-a001a85ab638)
- [HTTP response status codes](https://developer.mozilla.org/en-US/docs/Web/HTTP/Status)