我正在寻找从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。是的,我尝试了谷歌搜索。
答案 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更合适(无效请求。