1

我正在寻找从 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();

ps 是的,我试过谷歌搜索。

4

1 回答 1

2

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

如果您谈论错误响应,我可以将其与Server::fault()方法相关联(也可在 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(无效参数)比-32600(无效请求)更合适。

于 2013-08-20T08:38:11.313 回答