ASP.NET Web API的HTTP PATCH動詞與Patch方法實作

HTTP PATCH動詞與Patch方法

在ASP.NET Web API裡我們會利用HTTP PUT動詞與PUT方法來進行資料異動,不過PUT方法的異動是全部物件的異動,如果我們把部分資料傳入PUT方法進行異動,會產生一個非常驚訝的結果,就是其他沒有傳入的資料會全部被清除為空。正確的方法應該是使用HTTP PATCH動詞與Patch方法來進行部分資料的更新。

ASP.NET Web API HTTP PATCH方法實作

在《ASP.NET MVC 4網站開發美學》第7-52頁裡也有提到HTTP PATCH方法,書中未附上完整實作,以下提供實作內容:

     ' PATCH api/Products/5
     ''' <summary>
     ''' 僅更新產品名稱
     ''' </summary>
     ''' <param name="id">產品編號</param>
     ''' <param name="data">例用白名單過濾(Bind屬性)</param>
     Function PatchProduct(ByVal id As Integer, <Bind(include:="ProductName")> data As Product) As HttpResponseMessage
         Dim product As Product = db.Products.Find(id)

         If IsNothing(product) Then
             Throw New HttpResponseException(Request.CreateResponse(HttpStatusCode.NotFound))
         End If

         product.ProductName = data.ProductName
         db.Entry(product).State = EntityState.Modified

         Try
             db.SaveChanges()
         Catch ex As DbUpdateConcurrencyException
             Return Request.CreateErrorResponse(HttpStatusCode.NotFound, ex)
         End Try

         Return Request.CreateResponse(HttpStatusCode.OK)
     End Function
  

PATCH方法依照命名習慣由“Patch”為字首,參數id是要判斷是否有此筆資料存在,Bind是ASP.NET MVC的黑白名單屬性,這裡我選擇使用白名單,這樣的好處是,就算Client端傳入完整的物件資料,只有白名單的欄位會進行方法內部,而且不會報錯,也有比較好的安全性程式碼部分就是一般Entity Framework,對某一欄位進行異動並儲存,以完成部分更新的功能。

上述ASP.NET MVC的Bind屬性對於ASP.NET Web API無效,請參考另一篇「ASP.NET WEB API 2:安全的PATCH方法的三種實作」的作法。

2 則留言:

  1. 抱歉,可以請教一下可是這樣我有點搞不懂為何要增加的屬性耶?不增加也可以嗎?

    回覆刪除
  2. 屬性 - 的同意詞有好多個,你是指 Bind / Patch ...,你是指什麼?

    回覆刪除

感謝您的留言,如果我的文章你喜歡或對你有幫助,按個「讚」或「分享」它,我會很高興的。