iT邦幫忙

第 11 屆 iT 邦幫忙鐵人賽

DAY 8
2

此篇文章同步發表於個人部落格

如下為請求修改ID為2的動物資料

PUT|PATCH  api/animal/2  

AnimalController

public function update(Request $request, Animal $animal)
{
    $animal->update($request->all());
    return response($animal, Response::HTTP_OK);
}

完成!一樣很簡單吧!

PUT|PATCH 差別

Update 動作有兩種! PUT 以及 PATCH 很常搞混他們的差別。

我自己是這樣區分定義這兩種動作

  • PUT 是替換掉「整筆資料
  • PATCH 是修改「部分」的欄位
欄位 資料庫資料 使用者請求資料 PATCH 結果 PUT 結果
id 1 1 1 1
name 小黑 大黑 大黑 大黑
birthday 2019-1-1 (未設定) 2019-1-1 null
  • PATCH

    • 沒有設定的參數會保留舊有資料,其他有設定的會更新。
  • PUT

    • 可以看到跟PATCH 差別在於生日的欄位,未輸入的欄位,變成預設值或null (如果必填欄位沒有填寫,則回傳錯誤,修改動作失敗!)

ID不會讓人更改,最主要的功能是用來關聯以及識別,就算刪除資料也不會補空缺,會持續不斷得遞增。

也因為全部替換的機率不大,通常都是需要保留舊有的欄位資料,不會把它整筆替換掉,打算只用 PATCH 這種方法 ,Laravel 內建的設定是把這兩個動作,全部都指向update 方法。

這是我對 PATCH 與 PUT 的理解!有任何想法歡迎討論指教 ^^

但也再次強調,RESTful API是一種設計模式而已,可能公司或是手上的維護案已經有類似的規劃了,建議就照著目前的程式統一去撰寫,除非成本以及時間很多!再考慮找一個最好的方法來改版。

嘗試可不可以運行

因為我們還沒有實作查詢的動作!

我們再來新增一筆動物資料

新增一筆動物資料

如下圖設定 更改動物名稱為 多多

更新一筆動物資料

  1. 修改動詞PATCH
  2. 修改URI api/animal/6 <-預計修改的ID
  3. 確定x-www-form-urlencoded
  4. 輸入資料 以上圖為例就是要修改name欄位值為多多
  5. Send 送出請求
  6. 顯示結果確實變更為 多多 成功!

題外話 id是亂碼的網站怎麼做的

上面有提到id 讓我想到之前我很想知道為什麼,有些網站要把id 設定成一小段亂碼

以下是我自己的看法,例如 Youtube

https://www.youtube.com/watch?v=cBVGlBWQzuc

cBVGlBWQzuc 這一段亂碼是為了讓別人不要去猜到他們的id,但我想資料表內應該一樣有一組遞增的id來另外紀錄以及關聯(日後幾天的文章會提到關聯式資料庫的設計),以免發生重複的情況!例如刪除影片,上傳其他影片結果產生同樣亂碼,資料表沒有檢查到的狀況。

這組亂碼只是資料表中的其中一欄資料。依照程式邏輯在上傳影片(新增物件)這個動作時,去產生這組不重複的亂碼。

或者他的資料都是軟體刪除的方式,表面上刪除了檔案,但資料表的資料並未刪除,是利用一個欄位來判斷是否顯示而已, 例如 資料欄位 deleted_at 有日期表示已刪除,讀取資料要排除掉,這樣也可以避免產生重複的亂碼id。

好了今天就到這!休息一下明天繼續打造 API 剩下查詢功能囉!

最基本的操作就要完成了!加油!加油!

點上面Youtube連結 聽一下音樂消化一下吧!明天見


上一篇
刪除動物以及異常處理
下一篇
查詢動物
系列文
使用 Laravel 打造 RESTful API30

1 則留言

0
hohayo
iT邦新手 5 級 ‧ 2019-12-15 16:42:52

不好意思,我想要請問一下,剛看到有一篇新增動物資源時,在Postman的Body那頁籤下是選form-data,但這篇修改動物資源時,選的是 x-www-form-urlencoded,想了解為何不同設定的原因?

Victor iT邦新手 4 級‧ 2019-12-22 13:25:10 檢舉

謝謝您的回應!

x-www-form-urlencoded

一般來說像是網頁 POST 表單,預設是 x-www-form-urlencoded 它會把資料用這樣的形式去傳送

下面程式碼內容可以不用太在意
大約是 key=value 然後用 & 去做連結

color=%E4%B8%89%E8%8A%B1&kind=%E7%B1%B3%E5%85%8B%E6%96%AF&sex=F&name=%E9%BB%91%E7%86%8A&birthday=2010-10-18&fix=1&area=1&status_code=ADOPT&type_code=DOG&description=%E8%83%B8%E5%89%8D%EF%BC%B6%E5%AD%97%E7%99%BD%E6%AF%9B%E5%A5%BD%E5%8F%AF%E6%84%9B&personality=

form-data

如果選用 form-data 一般來說都是要上傳檔案使用,所以上傳檔案只有這個選擇 form-data,例如要上傳動物的圖片,使用者請求的資料有圖片的檔案。

Content-Disposition: form-data; name="color"

黑色
------WebKitFormBoundary7MA4YWxkTrZu0gW--

例如上面那一小段內容,就是color 變數以及他的內容 黑色

會有一個 boundary 來分割字串,然後取得使用者輸入得值。 boundary 就是 這一段 WebKitFormBoundary7MA4YWxkTrZu0gW 隨機產生的也不需要太在意

Postman 查看請求資料

可以點選下方紅色框框處看他怎麼傳送資料
https://ithelp.ithome.com.tw/upload/images/20191222/20105865WvRnJdifSg.png
傳送訪法有很多種 application/x-www-form-urlencoded multipart/form-data application/json text/xml

為什麼這裡會用 x-www-form-urlencoded

一開始我用 form-data 後端吃不到資料,所以我改用x-www-form-urlencoded ,據我了解這是 PHP本身的問題 不吃 put patch 動作,是laravel 偽照路由去讓後端吃到資料。

所以如果你想要更新動物資料時順便附上檔案一定要使用 form-data

解決方法可以用POST送資料加入 _method key 並給予 PUT 或 PATCH 的值,這樣後端也可以吃到資料

以上是小弟的理解,如果上述說明有誤,歡迎提出討論

我要留言

立即登入留言