Slim Framework v3 - REST API - 删除

时间:2016-11-09 19:46:19

标签: php rest slim

我目前正在学习如何使用适用于PHP的Slim Framework v3来建立自己的REST API。我找到了几个教程,并且能够构建多个路由以将GET和POST请求发送到我的MySQL数据库。

接下来是我的删除请求。我找到了一个教程,显示了以下代码:

$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);
});

事先我做了我的删除路线(正确使用这些术语吗?)几乎一样,除了我没有返回任何东西。这段代码让我感到疑惑:它是不是常见的#34;删除请求返回什么?根据我的理解,此请求假设返回表格中的所有其他条目" tasks" - 那是好习惯吗?是好的"一般来说,如果删除请求返回一些东西 - 如果是:什么?我正在努力适应最常见的做法。

旁注:我尝试使用这样的引用请求并且能够像往常一样删除某些内容。但是,它根本不会返回任何内容。

错误如下:



[...]
        <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>
[...]
&#13;
&#13;
&#13;

第68行是我的情况&#34; $ todos = $ sth-&gt; fetchAll();&#34;。

添加另一个关于&#34;良好做法&#34;的问题:我想检查通过删除请求提供的ID是否存在 - 这是否会包含在路由中(检查如果它存在)?或者还有其他类似检查的做法吗?

非常感谢。

1 个答案:

答案 0 :(得分:1)

  

删除请求返回某些内容是“常见的”吗?

     

如果删除请求返回,一般是“好”的做法   什么 - 如果是的话:什么?我正在努力适应最常见的   做法。

我会说必须退货。 删除是一项与其他任何操作一样的操作,因此当您的API客户端在特定实体上调用 delete 过程时,他们想知道该实体是否实际被删除。因此你应该归还一些东西。

你应该如何归还?

注意,这只是我的意见。

通常,REST API与协议(HTTP)“绑定”,HTTP提供了显示请求结果的绝佳选项:状态代码。您有200 OK404 Not Found500 Internal Server Error等,Here is the reference for HTTP codes

如果您正确使用它们,即使不适合您的API的开发人员也会理解它们并采取相应的行动。

对于“具有此ID”操作的删除实体,我将使用以下代码:

  • 404 Not Found:如果数据库中没有具有此ID的实体;
  • 400 Bad Request:如果网址中的ID无效(即不是正整数);或者你可以在这种情况下使用404,实际上。
  • 500 Internal Server Error:如果您身边的某些内容失败。像数据库操作失败;
  • 200 OK:如果删除操作成功。

任何具有一定经验的网络开发人员都非常了解这些代码,因此他们很容易理解结果。

  

根据我的理解,这个请求应该返回所有其他请求   “任务”表中的条目 - 这是一种好的做法吗?

不,不是真的。此请求调用“删除此任务”过程,并且应仅返回此特定操作的结果。以PDO为例:当你调用"DELETE FROM tasks WHERE id=:id"时,它会返回一个布尔值,指示操作是否成功;它不会从表中返回其他记录。所以,在这里应用相同的简单逻辑。