我正在使用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删除函数调用后的行。 这意味着响应可能是在调用函数之后构建的,并且忽略了返回的返回值。
答案 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的)响应对象中正确确认。