即使在成功操作后,Apigility也会返回错误

时间:2014-03-23 21:39:21

标签: php mysql api rest zend-framework2

我正在使用Apigility和Zend Framework 2构建REST API。 在这个API中,我有一个代码连接的REST服务,当我尝试删除一个实体时,我遇到了一个奇怪的行为。 我使用我的TableGateway对象的delete方法删除传递给"资源"的删除方法的数据。文件:

public function delete($id)
{
    //GetTable returns a TableGateway instance
    $this->getTable('order')->delete(array('id' => $id));
    return array("status" => "deleted", "id" => $id);
}

我使用Postman REST客户端测试了这个功能并得到了回复:

{
    "type":"http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html",
    "title":"Unprocessable Entity",
    "status":422,
    "detail":"Unable to delete entity."
}

但是,当我检查mysql数据库时,相关实体被正确删除。 没有出现错误的迹象。

返回此类错误的原因是什么?

更新: 代码到达TableGateway删除函数调用后的行。 这意味着响应可能是在调用函数之后构建的,并且忽略了返回的返回值。

3 个答案:

答案 0 :(得分:11)

如果将删除逻辑修改为“return true”,则API响应应按预期呈现HTTP 204。

...
class ItemResource extends AbstractResourceListener
{
    ...
    public function delete($id)
    {
        $service = $this->serviceManager->get('...\ItemService');
        $service->deleteItem($id);
        return true;
    }
    ...
}

答案 1 :(得分:1)

我知道这已经有几年了,但我自己也遇到了这个问题。虽然我没有解决方案,但我确实认为我已经隔离了实际问题,而不是您的响应对象。通过使用断点,我可以观察ZF2为每个API DELETE调用触发两次删除事件。

第一次通过时,一切正常,您删除了数据,但随后又全部被调用,导致“无法删除此实体”,因为该实体不再存在。

答案 2 :(得分:-1)

你的错误并不在于执行删除..但是在错误的回复中你要回传。

删除后,您需要考虑如何在格式良好(可能是基于JSON的)响应对象中正确确认。