2016-11-09 157 views
1

我目前正在學習如何使用適用於PHP的Slim Framework v3構建自己的REST API。我發現了幾個教程,並且能夠構建多條路由來將GET和POST請求發送到我的MySQL數據庫。Slim Framework v3 - REST API - 刪除

接下來是我的一個刪除請求。我發現了一個教程,呈現如下的一段代碼:

$app->delete('/todo/[{id}]', function ($request, $response, $args) { 
    $sth = $this->db->prepare("DELETE FROM tasks WHERE id=:id"); 
    $sth->bindParam("id", $args['id']); 
    $sth->execute(); 
    $todos = $sth->fetchAll(); 
    return $this->response->withJson($todos); 
}); 

在此之前我做了我刪除的路線(是,這些術語的正確使用?)幾乎是相同的,只是我沒有任何回報。這段代碼讓我想知道:刪除請求返回什麼是「常見」?從我的理解這個請求是假設返回表中的所有其他條目「任務」 - 這是一個好的做法?一般來說,如果刪除請求返回某些內容,是否是「良好」的做法 - 如果是:什麼?我正在嘗試適應最常見的做法。

在旁註:我試圖使用像這樣的引用請求,並能像往常一樣刪除一些東西。但是,它根本不返回任何東西。

誤差如下:

[...] 
 
     <h1>Slim Application Error</h1> 
 
     <p>The application could not run because of the following error:</p> 
 
     <h2>Details</h2> 
 
     <div> 
 
      <strong>Type:</strong> PDOException 
 
     </div> 
 
     <div> 
 
      <strong>Code:</strong> HY000 
 
     </div> 
 
     <div> 
 
      <strong>Message:</strong> SQLSTATE[HY000]: General error 
 
     </div> 
 
     <div> 
 
      <strong>File:</strong> /www/htdocs/src/routes.php 
 
     </div> 
 
     <div> 
 
      <strong>Line:</strong> 68 
 
     </div> 
 
[...]

68行是在我的情況 「$待辦事項= $ sth->使用fetchall();」。

要添加關於「良好實踐」的另一個問題:我想檢查通過刪除請求給出的ID是否存在 - 是否將包含在路由中(檢查它是否存在) ?還是有另一種做這種檢查的做法?

非常感謝。

回答

1

刪除請求返回什麼是「常見」?

如果刪除請求返回 ,那麼這是否是「良好」練習?如果是:什麼?我正在嘗試適應最常見的做法 。

我想說它是強制性的返回的東西。 刪除是一個像其他任何操作一樣的操作,所以當你的API的客戶端調用刪除過程對特定的實體,他們想知道實體是否被實際刪除。因此你應該回報一些東西。

你應該如何歸還?

請注意,這只是我的意見。

通常,REST API與協議(HTTP)「綁定」,HTTP提供了一個很好的選項來顯示請求的結果:狀態碼。您有200 OK,404 Not Found,500 Internal Server ErrorHere is the reference for HTTP codes

只要你適當地使用它們,即使一個不太適合API的開發者也會理解它們並採取相應的行動。

對於「刪除實體,此ID爲」操作,我會使用以下代碼:

  • 404 Not Found:如果沒有與此ID在數據庫中沒有實體;
  • 400 Bad Request:如果URL中的ID無效(即不是正整數);或者實際上你可以在這個場景中使用404。
  • 500 Internal Server Error:如果在您身邊失敗。像數據庫操作失敗;
  • 200 OK:如果刪除操作成功。

任何具有一定經驗的網絡開發人員都非常瞭解這些代碼,因此他們會很容易地理解結果。

從我的理解這個請求應該返回表中的所有其他 條目「任務」 - 這是好的做法嗎?

不,不是真的。此請求調用「刪除此任務」過程,並且應僅返回此特定操作的結果。以PDO爲例:當您撥打"DELETE FROM tasks WHERE id=:id"時,它返回布爾值,表示操作是否成功;它不會從表中返回其他記錄。所以,在這裏應用相同的簡單邏輯。