如何使用ApiGility和RPC创建数据并返回格式正确的json

时间:2015-02-20 11:54:11

标签: php json zend-framework2 apigility

我正在使用ApiGilty的RPC服务来返回一些数据。我想仔细检查这是否是格式化和返回数据的正确方法,因为我不能100%确定正确的过程。

编辑:澄清 数据是从许多实体构建的:

main
main_extra
main_data
main_data_days
main_data_tiers

有没有办法命中main并获取所有子实体?目前我正在从头开始构建我的数据并返回一个数组。

我的RPC控制器如下:

use My\Data\Controller\DataInterface;
use Zend\Mvc\Controller\AbstractActionController;
use ZF\ContentNegotiation\ViewModel;

class MyDataController extends AbstractActionController
{
    const GENERAL_ERROR = 'api.rpc.my-data.my-data-controller';

    public function __construct(
        MyDataInterface $myData
    )
    {
        $this->myData = $myData;
    }


    public function myDataAction()
    {

        $my_id    = (int) $this->params()->fromRoute('my_id', 0);

        if ($my_id == 0)
        {
            $data = $this->myData->getMyData();
        } else
        {
            $data = $this->myData->getMyData($my_id);
        }

        $result = new ViewModel(array(
            'data' => $data
        ));

        return $result;

    }

}

现在要创建我正在做的事情:

public function getMyData( $my_id = null )
{
    $returnArray = [];

    $array1 = [
        'key_1' => [1,2,3,4],
        'key_2' => '123',
        'key_3' => ['a','b','c']
    ];

    $array2 = [
        'key_1' => [1,2,3,4,5,6,7,8],
        'key_2' => '123456',
        'key_3' => ['a','b','c','d']
    ];

    if ($my_id == 1) {
        $array3 = ['some','or','other'];
    } else {$array3 = []; }

    $final_array = [
        'data1' => $array1,
        'data2' => $array2,
        'data3' => $array3
    ];

    $returnArray['data'] = $final_array;
    $returnArray['success'] = 'true';
    $returnArray['reason']  = '';


    return $returnArray;

}

与邮递员核实时,我得到以下信息:

enter image description here

既然我没有提及任何内容,我的问题很简单。我是否以正确的方式解决了这个问题,这是如何格式化返回代码的?

谢谢!

2 个答案:

答案 0 :(得分:1)

目前,Hal插件未用于渲染您的结果?您正在响应自定义json对象。这真的是你想要的吗?

您当前返回的回复未按照HAL规范进行格式化。正确的HAL响应应至少包含_links self href的{​​{1}}密钥。将Content-Type标头设置为application/hal+json时返回此结果是错误的。您应该使用application/json代替。

Here you can find documentation on how to respond HAL from an RPC-contoller

我不确定你想要达到的目的但也许你可以在你的问题中更具体一些,以便其他人可以帮助...

答案 1 :(得分:0)

看起来不太糟糕,或许坚持使用jsend http://labs.omniti.com/labs/jsend之类的标准,或者你可以使用hal-json,matthew weier o'phinney在此https://mwop.net/blog/2014-03-26-apigility-rpc-with-hal.html上有一篇很好的博客文章

此外,您不需要返回视图模型,因为您只能返回一个数组,而apigility将返回JSON。如果沿着那条路走下去,你也可以写一个jsendViewModel。

不完全是答案,但希望这可以帮到你!