POST请求中的嵌套参数/值

问题描述:

我一直在考虑一种处理POST请求中的嵌套/复杂值的好方法。POST请求中的嵌套参数/值

例如,订单可能包含单个POST请求中的订单项集合,用于创建订单。订单和订单项都是作为资源存在的。但是,我非常希望只有一个请求会创建订单和订单项目实体。处理资源中的问题不是问题,但我想知道如何使用apigiliy UI配置资源(让我们称之为订购地点) - 或者,如果完全不可能,请使用配置。应用验证器和过滤器是appigility的关键特性之一,我想继续使用它,即使对于复杂的请求数据。

并且在您提出要求之前,使用下划线来分隔值范围,例如order_comment和order_item_comment不应该是一个选项。

任何想法:)

加成:样本json的请求负载可能看起来像这样:

{ 
"created_at": "2000-01-01", 
"amount" : "5000.00", 
"address" : { 
    "name": "some name", 
    "street": "some street" 
    ... 
}, 
"items" : [ 
    {"productId":99,"qty":1} 
    ... 
] 
} 
+0

你可以提供一个示例JSON发送到服务器?希望以你的方式构建一个理想。 – Boris 2014-12-05 16:55:21

如果您使用的是ContentValidation模块,那么你可以配置嵌套资源的输入滤波器通过分配给一个变量。然后你必须添加一个类型键(否则重用过滤器将不起作用)。现在,您可以在input_filter_specs中使用此变量,并且可以在另一个过滤器中重新使用整个过滤器。因此,像这样在你的config.php

<?php 

namespace Application; 

// Your address config as if it was used independently 
$addressInputFilter => array(
    'name' => array(
     'name' => 'name', 
     'required' => true, 
     'filters' => array(
      //... 
     ) 
     'validators' => array(
      //... 
     ) 
    ), 
    'street' => array(
     'name' => 'street', 
     'required' => true, 
     'filters' => array(
      //... 
     ) 
     'validators' => array(
      //... 
     ) 
    ), 
    // 'type' key necessary for reusing this input filter in other configs 
    'type' => 'Zend\InputFilter\InputFilter' 
), 


'input_filter_specs' => array(
    // The key for your address if you also want to be able to use it independently 
    'Application\InputFilter\Address'=> $addressInputFilter, 
    // The key and config for your other resource containing a nested address 
    'Application\InputFilter\ItemContainingAddress'=> array(
     'address' => $addressInputFilter, 
     'amount' => array(
      'name' => 'amount', 
      'required' => true, 
      'filters' => array(
       //... 
      ), 
      'validators' => array(
       //... 
      ) 
     ) 
     //... your other fields 
    ) 
) 
+0

这至少会允许我应用过滤器和验证程序,到目前为止确实如此。但它并没有使用apigility ui在文档和混淆方面给出的功能。经过一些更多的研究后,恐怕这是不可能的。也许这是Github项目的时间...... :) – sedegu 2014-12-12 13:28:11

从张伯伦的回答开始,我发现下面的代码工作,以及:

# file path: /module/MyApi/config/module.config.php 

// some other stuff 

    'MyApi\\V1\\Rest\\MyRestService\\Validator' => array(
     'address' => array(
      0 => array(
       'name'  => 'name', 
       'required' => true, 
       'filters' => array(), 
       'validators' => array(), 
      ), 
      1 => array(
       'name'  => 'street', 
       'required' => true, 
       'filters' => array(), 
       'validators' => array(), 
      ), 
      'type' => 'Zend\InputFilter\InputFilter' 
     ), 
     'amount' => array(
      'name'  => 'amount', 
      'required' => true, 
      'filters' => array(), 
      'validators' => array() 
     ) 

address如通过我得到的唯一的问题是一个字段(字符串或数字)而不是数组或对象。在这种情况下Apigility抛出异常:

的Zend \ InputFilter输入\异常\ InvalidArgumentException:Zend的\ InputFilter输入\ BaseInputFilter ::使用setData期望的阵列或Traversable的一个参数;在线路接收到的字符串中/var/www/api/vendor/zendframework/zendframework/library/Zend/InputFilter/BaseInputFilter.php 175

添加address作为更简单的(必需的)字段避免了异常,但随后无论我们将address作为namestreet或虚拟字符串的数组传递,Apigility没有任何区别。