2016-11-09 159 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"时,它返回布尔值,表示操作是否成功;它不会从表中返回其他记录。所以,在这里应用相同的简单逻辑。