ZF2 JSON-RPC - 错误响应,数据参数,如何访问?

时间:2014-05-10 19:43:41

标签: zend-framework zend-framework2 json-rpc

假设我有一个用于添加颜色的RPC调用。用户只能添加一次颜色。如果他们第二次添加一个,我想返回一个错误响应,告诉他们搞砸了,为什么。

JSON-RPC错误响应描述了error object,其中包含数据参数的空间。在这里,似乎适合包含我的“已添加颜色”的错误代码。但是,我无法弄清楚如何在响应中返回它。

$jsonRpc = new Server();
$jsonRpc->setClass(new Testi());
$jsonRpc->getRequest()->setVersion(Server::VERSION_2);

if ($_SERVER['REQUEST_METHOD'] == 'GET') {
    echo $jsonRpc->getServiceMap()->setEnvelope(Smd::ENV_JSONRPC_2);
}
else {
    $jsonRpc->handle();
}


class Testi {

    const ERROR_CODE_COLOR_EXISTS = 5;

    private $colors = ['red', 'green'];

    /**
     * @param $color
     * @return array
     */
    public function addColor($color) {
        if (in_array($color, $this->colors)) {
            throw new \Exception('Color exists');
        }
        else {
            $this->colors[] = $color;
        }

        return $this->colors;
    }
}

这有效,返回错误响应的程度,但没有选择包含我的错误代码(self :: ERROR_CODE_COLOR_EXISTS)。

{"error":{"code":-32000,"message":"Color exists","data":{}},"id":"","jsonrpc":"2.0"}

如何将信息放入DATA参数!?

谢谢, 亚当

1 个答案:

答案 0 :(得分:0)

原来你有两个选择:

1)向例外添加参数:

$e = new Exception('I pooped my pants');
$e->color = 'brown';
$->smell = 'bad';
然后,

颜色和气味将出现在错误响应的数据参数中。

2)将服务器(在我的代码中,$ jsonRpc)传递给对象(在我的代码中,它看起来像:new Testi($ jsonRpc)),并使用fault(...)方法,允许您将数据数组/对象传递给它。

后一种方法为您提供了更大的灵活性,因为您可以执行数据 - >代码,数据 - >消息,这两种情况都不能在$ e对象上设置,因为它们是现有的受保护参数。但是,然后您将模型耦合到$ jsonRpc服务器,这是不好的。

所有这一切,都不是回应我上面概述的情景的正确方法。错误响应或多或少保留用于真正的,不可恢复的服务器错误,类似于实际异常,而不是用户验证错误。在我的情况下,最好定义一个响应类型,允许我使用适当的响应代码返回成功/失败值。 {success:false,代码:5}。

干杯, 亚当