* @link http://www.pradosoft.com/ * @copyright 2010 Bigpoint GmbH * @license http://www.pradosoft.com/license/ * @since 3.2 * @package Prado\Util */ namespace Prado\Util; use Prado\Exceptions\TApplicationException; use Prado\TPropertyValue; /** * TRpcClient class * * Note: When using setIsNotification(true), *every* following request is also * considered to be a notification until you use setIsNotification(false). * * Usage: * * First, you can use the factory: *
 * $_rpcClient = TRpcClient::create('xml', 'http://host/server');
 * $_result = $_rpcClient->remoteMethodName($param, $otherParam);
 * 
* * or as oneliner: *
 * $_result = TRpcClient::create('json', 'http://host/server')->remoteMethod($param, ...);
 * 
* * Second, you can also use the specific implementation directly: *
 * $_rpcClient = new TXmlRpcClient('http://host/server');
 * $_result = $_rpcClient->remoteMethod($param, ...);
 * 
* * or as oneliner: *
 * $_result = TXmlRpcClient('http://host/server')->hello();
 * 
* * @author Robin J. Rogge * @package Prado\Util * @since 3.2 */ class TRpcClient extends \Prado\TApplicationComponent { /** * @var string url of the RPC server */ private $_serverUrl; /** * @var boolean whether the request is a notification and therefore should not care about the result (default: false) */ private $_isNotification = false; // magics /** * @param string url to RPC server * @param boolean whether requests are considered to be notifications (completely ignoring the response) (default: false) */ public function __construct($serverUrl, $isNotification = false) { $this->_serverUrl = $serverUrl; $this->_isNotification = TPropertyValue::ensureBoolean($isNotification); } // methods /** * Creates an instance of the requested RPC client type * @return TRpcClient instance * @throws TApplicationException if an unsupported RPC client type was specified */ public static function create($type, $serverUrl, $isNotification = false) { if(($_handler = constant('TRpcClientTypesEnumerable::'.strtoupper($type))) === null) throw new TApplicationException('rpcclient_unsupported_handler'); return new $_handler($serverUrl, $isNotification); } /** * Creates a stream context resource * @param mixed $content * @param string $contentType mime type */ protected function createStreamContext($content, $contentType) { return stream_context_create(array( 'http' => array( 'method' => 'POST', 'header' => "Content-Type: {$contentType}", 'content' => $content ) )); } /** * Performs the actual request * @param string RPC server URL * @param array payload data * @param string request mime type */ protected function performRequest($serverUrl, $payload, $mimeType) { if(($_response = @file_get_contents($serverUrl, false, $this->createStreamContext($payload, $mimeType))) === false) throw new TRpcClientRequestException('Request failed ("'.$http_response_header[0].'")'); return $_response; } // getter/setter /** * @return boolean whether requests are considered to be notifications (completely ignoring the response) */ public function getIsNotification() { return $this->_isNotification; } /** * @param string boolean whether the requests are considered to be notifications (completely ignoring the response) (default: false) */ public function setIsNotification($bool) { $this->_isNotification = TPropertyValue::ensureBoolean($bool); } /** * @return string url of the RPC server */ public function getServerUrl() { return $this->_serverUrl; } /** * @param string url of the RPC server */ public function setServerUrl($value) { $this->_serverUrl = $value; } }