zf2 JSON-RPC服务器如何返回自定义错误

时间:2013-08-19 19:01:49

标签: zend-framework2 json-rpc

我正在寻找从JSON-RPC公开的类返回自定义错误的正确方法。

JSON-RPC具有报告错误情况的特殊格式。所有错误都需要提供最低限度的错误消息和错误代码;可选地,它们可以提供其他数据,例如回溯。

错误代码源自XML-RPC EPI项目推荐的错误代码。 Zend \ Json \ Server根据错误情况适当地分配代码。对于应用程序异常,使用代码'-32000'。

我将使用文档中示例代码的divide方法来解释:

<?php
/**
 * Calculator - sample class to expose via JSON-RPC
 */
class Calculator
{
    /**
     * Return sum of two variables
     *
     * @param  int $x
     * @param  int $y
     * @return int
     */
    public function add($x, $y)
    {
        return $x + $y;
    }

    /**
     * Return difference of two variables
     *
     * @param  int $x
     * @param  int $y
     * @return int
     */
    public function subtract($x, $y)
    {
        return $x - $y;
    }

    /**
     * Return product of two variables
     *
     * @param  int $x
     * @param  int $y
     * @return int
     */
    public function multiply($x, $y)
    {
        return $x * $y;
    }

    /**
     * Return the division of two variables
     *
     * @param  int $x
     * @param  int $y
     * @return float
     */
    public function divide($x, $y)
    {
        if ($y == 0) {
            // Say "y must not be zero" in proper JSON-RPC error format
            // e.g. something like {"error":{"code":-32600,"message":"Invalid Request","data":null},"id":null} 
        } else {
            return $x / $y;
        }
    }
}


$server = new Zend\Json\Server\Server();
$server->setClass('Calculator');

if ('GET' == $_SERVER['REQUEST_METHOD']) {
    // Indicate the URL endpoint, and the JSON-RPC version used:
    $server->setTarget('/json-rpc.php')
    ->setEnvelope(Zend\Json\Server\Smd::ENV_JSONRPC_2);

    // Grab the SMD
    $smd = $server->getServiceMap();

    // Return the SMD to the client
    header('Content-Type: application/json');
    echo $smd;
    return;
}

$server->handle();

P.S。是的,我尝试了谷歌搜索。

1 个答案:

答案 0 :(得分:2)

免责声明:我没有任何使用Zend\Json\Server的经验:)

如果您谈论错误回复,我可以将其与Server::fault()方法(也是available on Github)相关联。因此,我假设如果调用fault()并将其注入响应,它将根据您推荐的XML-RPC服务器标准返回带有错误消息的响应。

处理程序方法将实际工作代理到_handle()(链接到源),其中try/catch将调度封装到(在您的情况下)Calculator类中。

根据异常消息和异常代码调用错误。因此我认为它只是抛出异常并在那里设置正确的消息/代码:

use Zend\Json\Server\Error;

class Calculator
{
    public function divide($x, $y) 
    {
        if (0 === $y) {
            throw new InvalidArgumentException(
                'Denominator must be a non-zero numerical',
                Error::ERROR_INVALID_PARAMS
            );
        }

        // Rest here
    }

    // Rest here
}

PS。我也在这里更改了你的错误代码,对我来说,感觉-32602(无效的params)比-32600更合适(无效请求。