三、 RESTFUL API & laravel (part1) - amattsuyolo/cham GitHub Wiki
參考文章
-
[不是工程師] 休息(REST)式架構? 寧靜式(RESTful)的Web API是現在的潮流?
-
為什麼要用 RESTful
-
https://codertw.com/%E7%A8%8B%E5%BC%8F%E8%AA%9E%E8%A8%80/106509/
-
Laravel 建立 RESTful API
-
https://hackmd.io/@8irD0FCGSQqckvMnLpAmzw/Hk8QeMNLz?type=view
-
簡明RESTful API設計要點
心智圖內容將會不定期更新
API相關的介紹見參考文章或心智圖,
HTTP回傳狀態碼 API回傳的結果,應使用適當的HTTP狀態碼,所以API設計者必須了解它們。以下是一些常用的狀態碼,完整列表請參考Wikipedia。
2xx: 成功
200 OK: 通用狀態碼
201 Created: 資源新增成功
202 Accepted: 請求已接受,但尚在處理中
204 No Content: 請求成功,但未回傳任何內容
3xx: 重新導向
301 Moved Permanently: 資源已移至它處
303 See Other: 回傳的內容可在它處取得(例如在用戶端發送了一個POST請求之後)
304 Not Modified: 請求的資源並未修改(通常是用戶端發送了帶有If-Modified-Since或If-None-Match表頭的請求)
4xx: 用戶端錯誤(用戶端不應retry原始請求)
400 Bad Request: 通用狀態碼
401 Unauthorized: 用戶端尚未驗證*
403 Forbidden: 用戶端被禁止此請求*
404 Not Found: 請求的資源不存在
405 Method Not Allowed: 不支援請求的HTTP方法
406 Not Acceptable: 不支援請求所要求的內容類型*(Accept表頭)
415 Unsupported Media Type: 不支援請求所用的內容類型*(Content-Type表頭)
5xx: 伺服器錯誤(用戶端可合理retry)
500 Internal Server Error: 工程師要找bug了
501 Not Implemented: 用戶端的請求目前未支援(也就是將來有可能支援)
502 Bad Gateway: 上游的伺服器未回傳正確結果,一般是gateway或proxy server才會回傳此狀態碼
503 Service Unavailable: 暫停服務(也就是過不久就會恢復服務──如果一切順利的話)
504 Gateway Timeout: 上游的伺服器逾時,一般是gateway或proxy server才會回傳此狀態碼
對於API的下列三個部分
Resource:資源。
Representational:表現形式。
State Transfer:狀態變化。利用HTTP動詞
依造個人經驗會遇到部分更新時
如刪除多個撥放紀錄,路由可能是:
localhost/watchrecord/batch verb use delete
或遇到每日登入獎勵搭配連續五天登入獎勵規則
需要同時增加虛擬幣、更改領取狀態、判斷連續天數,此類複雜情形路由相對難以按造restful 風格設計:
LARAVEL 相關輔助整理
資源控制器
當我們需要建立一個影片控制器,專門掌控影片的所有動作如 :
- 顯示所有
- 儲存
- 顯示單個
- 更新
- 刪除
可以下以下指令
laravel 指令 php artisan make:controller api/VideosController --api
不需要自行註冊每一個路由
只需要一行程式碼:
Route::resource("videos","api\VideosController");
產生對應的路由名稱與方法如下
Actions Handled By Resource Controller
Verb URI Action Route Name
GET /videos index videos.index
POST /videos store videos.store
GET /videos/{video} show videos.show
PUT/PATCH /videos/{video} update videos.update
DELETE /videos/{video} destroy videos.destroy
如果僅僅需要顯示所有與儲存功能,路由部分可以調整如下
Route::resource('videos', 'VideosController')->only([
'index', 'store'
]);
或是
Route::resource('photos', 'PhotoController')->except([
'show', 'update', 'destroy'
]);
API Resource
當你在建立一個 API 時,可能會需要一個位於 Eloquent 模型和實際回傳給使用者的 JSON 回應之間的轉換層。Laravel 的資源類別可以讓你更直觀且容易的將你的模型和模型集合轉換成 JSON。
https://laravel.com/docs/5.8/eloquent-resources
API Resource 最大的優點是解耦了數據格式與業務代碼的耦合,提高了代碼的複用性和可維護性,更多功能可以參考官方文檔,這些都只是帶你入門,更多功能的使用和發掘,有賴你在實踐中去探尋。
個人認為良好的應用response()->json(["msg"=>"success","data"=>["video_id"=>"2000121",.......])即可解決大部分問題,將回傳數據格式分離,對於不夠巨大的專案有點過度設計的味道 https://laravel.com/docs/5.8/responses
後續持續更新.........