我最近探索过Apigility我想使用HTTP DELETE方法删除一些实体但在删除之前我需要验证“entityId”必须给出并且必须是Digit和trim。 问题是文档提到:
内容验证目前仅适用于POST,PATCH和PUT请求。如果需要验证查询字符串参数,则需要为这些任务编写自己的逻辑。 https://apigility.org/documentation/content-validation/intro 我在配置文件中做了一些客户修改,如下所示:
'NetworkingNightAPI\\V1\\Rpc\\DeleteSlotByLoginUser\\Controller' => [
'DELETE' => 'NetworkingNightAPI\\V1\\Rpc\\AssignTimeSlotToLoginUser\\Validator',
],
正如我提到DELETE方法验证相同的NetworkingNightAPI \ V1 \ Rpc \ AssignTimeSlotToLoginUser \ Validator但问题是它总是返回'值不能为空'即使我使用PostMan添加了有效的行JSON值
谢谢!
答案 0 :(得分:0)
如果要删除资源,则应使用包含该实体路由的url
。这意味着id
将在您的路由参数中,而不在您的查询参数中。因此id是路由参数/标识符,RestController
将使用资源侦听器的fetch($id)
方法中的标识符搜索您的实体。如果具有该标识符的实体不存在,则监听器应返回未找到的(404)响应。
您在问题中提到的内容验证用于验证POST / GET参数。因此,在删除请求的情况下不需要这样的验证器。
所以说例如你要删除一个Slot
你有一条路线:
api/v1/slots/[slot_id]
如果您要删除ID为Slot
的{{1}},则会向以下位置发送删除请求:
1
如果DELETE
api/v1/slots/1
Slot
slot_id
不存在1
,您的听众应该只返回404回复。
答案 1 :(得分:0)
我看到您使用RPC而不是Rest样式 - 如果您使用查询字符串传递参数,则必须在控制器内自行验证,例如:
public function someActionMethod()
{
$id = $this->getRequest()->getQuery('id');
$validator = new Input('id');
$validator->getValidatorChain()
->attach(new \Zend\Validator\NotEmpty())
;
$validator->getFilterChain()
->attach(new StringToUpper())
;
$inputFilter = new InputFilter();
$inputFilter
->add($validator)
->setData($this->getRequest()->getQuery())
;
if( ! $inputFilter->isValid()) {
return new \ZF\ApiProblem\ApiProblemResponse(
new ApiProblem(400, $inputFilter)
);
}
}
Apigility不会使用使用UI生成的任何配置来验证通过查询字符串传递的那些字段,如文档中所述 - 它们将被忽略。您需要自己生成valaidator。
如果您愿意,可以将其设置为使用配置生成验证,然后在控制器内加载验证器以节省如上所述的写锅炉板代码。
答案 2 :(得分:0)
感谢您的回复
我发现的是Apigility使用&zf-content-validation'用于验证输入数据的模块( https://github.com/zfcampus/zf-content-validation )
此模块不限制此类HTTP方法您可以将验证应用于DELETE方法,就像它说的那样
"在上面的示例中,将为PATCH,PUT或DELETE请求选择Application \ Controller \ HelloWorld \ Validator服务,而为POST请求选择Application \ Controller \ HelloWorld \ CreationValidator。&# 34;
所以你只需要在配置文件中添加DELETE方法的手动输入,如下所示:
'NetworkingNightAPI\\V1\\Rpc\\DeleteSlotByLoginUser\\Controller' => [
'input_filter' => 'NetworkingNightAPI\\V1\\Rpc\\DeleteSlotByLoginUser\\Validator',
'DELETE' => 'NetworkingNightAPI\\V1\\Rpc\\DeleteSlotByLoginUser\\Validator',
],
此外,HTTP DELETE方法不会使用POSTMAN中的JSON行体验证您必须传递查询参数,并且在您的控制器中,您需要使用如下插件获取验证数据:
$recruiterId = $this->getInputFilter()->getValues()['recruiterId'];
$timeSlotId = $this->getInputFilter()->getValues()['timeSlotId'];