httpClient = $httpClient ?: new HttpClient(); $this->serverAddress = $server; } /** * Sets the HTTP client object to use for connecting the JSON-RPC server. * * @param HttpClient $httpClient New HTTP client to use. * @return Client Self instance. */ public function setHttpClient(HttpClient $httpClient) { $this->httpClient = $httpClient; return $this; } /** * Gets the HTTP client object. * * @return HttpClient HTTP client. */ public function getHttpClient() { return $this->httpClient; } /** * The request of the last method call. * * @return Request Request instance. */ public function getLastRequest() { return $this->lastRequest; } /** * The response received from the last method call. * * @return Response Response instance. */ public function getLastResponse() { return $this->lastResponse; } /** * Perform an JSOC-RPC request and return a response. * * @param Request $request Request. * @return Response Response. * @throws Exception\HttpException When HTTP communication fails. */ public function doRequest($request) { $this->lastRequest = $request; $httpRequest = $this->httpClient->getRequest(); if ($httpRequest->getUriString() === null) { $this->httpClient->setUri($this->serverAddress); } $headers = $httpRequest->getHeaders(); $headers->addHeaders(array( 'Content-Type' => 'application/json', 'Accept' => 'application/json', )); if (!$headers->get('User-Agent')) { $headers->addHeaderLine('User-Agent', 'Zend_Json_Server_Client'); } $this->httpClient->setRawBody($request->__toString()); $this->httpClient->setMethod('POST'); $httpResponse = $this->httpClient->send(); if (!$httpResponse->isSuccess()) { throw new Exception\HttpException( $httpResponse->getReasonPhrase(), $httpResponse->getStatusCode() ); } $response = new Response(); $this->lastResponse = $response; // import all response data from JSON HTTP response $response->loadJson($httpResponse->getBody()); return $response; } /** * Send an JSON-RPC request to the service (for a specific method). * * @param string $method Name of the method we want to call. * @param array $params Array of parameters for the method. * @return mixed Method call results. * @throws Exception\ErrorException When remote call fails. */ public function call($method, $params = array()) { $request = $this->createRequest($method, $params); $response = $this->doRequest($request); if ($response->isError()) { $error = $response->getError(); throw new Exception\ErrorException( $error->getMessage(), $error->getCode() ); } return $response->getResult(); } /** * Create request object. * * @param string $method Method to call. * @param array $params List of arguments. * @return Request Created request. */ protected function createRequest($method, array $params) { $request = new Request(); $request->setMethod($method) ->setParams($params) ->setId(++$this->id); return $request; } }