summaryrefslogtreecommitdiff
path: root/framework/Util/TJsonRpcClient.php
diff options
context:
space:
mode:
Diffstat (limited to 'framework/Util/TJsonRpcClient.php')
-rw-r--r--framework/Util/TJsonRpcClient.php89
1 files changed, 89 insertions, 0 deletions
diff --git a/framework/Util/TJsonRpcClient.php b/framework/Util/TJsonRpcClient.php
new file mode 100644
index 00000000..1a8dbba4
--- /dev/null
+++ b/framework/Util/TJsonRpcClient.php
@@ -0,0 +1,89 @@
+<?php
+/**
+ * @author Robin J. Rogge <rrogge@bigpoint.net>
+ * @link http://www.pradosoft.com/
+ * @copyright 2010 Bigpoint GmbH
+ * @license http://www.pradosoft.com/license/
+ * @since 3.2
+ * @package System.Util
+ */
+
+/**
+ * TJsonRpcClient class
+ *
+ * Note: When using setIsNotification(true), *every* following request is also
+ * considered to be a notification until you use setIsNotification(false).
+ *
+ * Usage:
+ * <pre>
+ * $_rpcClient = new TJsonRpcClient('http://host/server');
+ * $_result = $_rpcClient->remoteMethod($param, $otherParam);
+ * // or
+ * $_result = TJsonRpcClient::create('http://host/server')->remoteMethod($param, $otherParam);
+ * </pre>
+ *
+ * @author Robin J. Rogge <rrogge@bigpoint.net>
+ * @version $Id$
+ * @package System.Util
+ * @since 3.2
+ */
+
+class TJsonRpcClient extends TRpcClient
+{
+ // magics
+
+ /**
+ * @param string RPC method name
+ * @param array RPC method parameters
+ * @return mixed RPC request result
+ * @throws TRpcClientRequestException if the client fails to connect to the server
+ * @throws TRpcClientResponseException if the response represents an RPC fault
+ */
+ public function __call($method, $parameters)
+ {
+ // send request
+ $_response = $this->performRequest($this->getServerUrl(), $this->encodeRequest($method, $parameters), 'application/json');
+
+ // skip response handling if the request was just a notification request
+ if($this->isNotification)
+ return true;
+
+ // decode response
+ if(($_response = json_decode($_response, true)) === null)
+ throw new TRpcClientResponseException('Empty response received');
+
+ // handle error response
+ if(!is_null($_response['error']))
+ throw new TRpcClientResponseException($_response['error']);
+
+ return $_response['result'];
+ }
+
+ // methods
+
+ /**
+ * @param string method name
+ * @param array method parameters
+ */
+ public function encodeRequest($method, $parameters)
+ {
+ static $_requestId;
+ $_requestId = ($_requestId === null) ? 1 : $_requestId + 1;
+
+ return json_encode(array(
+ 'method' => $method,
+ 'params' => $parameters,
+ 'id' => $this->isNotification ? null : $_requestId
+ ));
+ }
+
+ /**
+ * Creates an instance of TJsonRpcClient
+ * @param string url of the rpc server
+ * @param boolean whether the requests are considered to be notifications (completely ignoring the response) (default: false)
+ */
+ public static function create($type, $serverUrl, $isNotification = false)
+ {
+ return new self($serverUrl, $isNotification);
+ }
+} \ No newline at end of file