假设我有一个用于添加颜色的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参数!?
谢谢, 亚当
答案 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}。
干杯, 亚当