Author

Topic: JSON-RPC php класс (Read 2841 times)

full member
Activity: 224
Merit: 100
June 16, 2014, 03:46:07 AM
#1
Возможно, кому-то пригодится - читать внятные ошибки от bitcoind по JSON-RPC протоколу, вместо
 Error connection ...
Меняем стандартный jsonRPCClient.php на тот, что ниже.

p.s. Мопед не мой

Code:
/*
COPYRIGHT

Copyright 2007 Sergio Vaccaro 

This file is part of JSON-RPC PHP.

JSON-RPC PHP is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.

JSON-RPC PHP is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
GNU General Public License for more details.

You should have received a copy of the GNU General Public License
along with JSON-RPC PHP; if not, write to the Free Software
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
*/

/**
 * The object of this class are generic jsonRPC 1.0 clients
 * http://json-rpc.org/wiki/specification
 *
 * @author sergio 
 */
class jsonRPCClient {

    
/**
     * Debug state
     *
     * @var boolean
     */
    
private $debug;

    
/**
     * The server URL
     *
     * @var string
     */
    
private $url;
    
/**
     * The request id
     *
     * @var integer
     */
    
private $id;
    
/**
     * If true, notifications are performed instead of requests
     *
     * @var boolean
     */
    
private $notification false;

    
/**
     * Takes the connection parameters
     *
     * @param string $url
     * @param boolean $debug
     */
    
public function __construct($url,$debug false) {
        
// server URL
        
$this->url $url;
        
// proxy
        
empty($proxy) ? $this->proxy '' $this->proxy $proxy;
        
// debug state
        
empty($debug) ? $this->debug false $this->debug true;
        
// message id
        
$this->id 1;
    }

    
/**
     * Sets the notification state of the object. In this state, notifications are performed, instead of requests.
     *
     * @param boolean $notification
     */
    
public function setRPCNotification($notification) {
        empty(
$notification) ?
            
$this->notification false
            
:
            
$this->notification true;
    }

    
/**
     * Performs a jsonRCP request and gets the results as an array
     *
     * @param string $method
     * @param array $params
     * @return array
     */
    
public function __call($method,$params) {

        
// check
        
if (!is_scalar($method)) {
            throw new 
Exception('Method name has no scalar value');
        }

        
// check
        
if (is_array($params)) {
            
// no keys
            
$params array_values($params);
        } else {
            throw new 
Exception('Params must be given as array');
        }

        
// sets notification or request task
        
if ($this->notification) {
            
$currentId NULL;
        } else {
            
$currentId $this->id;
        }

        
// prepares the request
        
$request = array(
            
'method' => $method,
            
'params' => $params,
            
'id' => $currentId
        
);
        
$request json_encode($request);
        
$this->debug && $this->debug.='***** Request *****'."\n".$request."\n".'***** End Of request *****'."\n\n";

        
// performs the HTTP POST
        
$ch curl_init($this->url);
        
curl_setopt($ch,CURLOPT_RETURNTRANSFERtrue);
        
curl_setopt($chCURLOPT_HTTPHEADER, array('Content-type: application/json'));
        
curl_setopt($chCURLOPT_POSTtrue);
        
curl_setopt($chCURLOPT_POSTFIELDS$request);
        
$response json_decode(curl_exec($ch),true);
        
curl_close($ch);
        
// debug output
        
if ($this->debug) {
            echo 
nl2br($this->debug);
        }

        
// final checks and return
        
if (!$this->notification) {
            
// check
            
if ($response['id'] != $currentId) {
                throw new 
Exception('Incorrect response id (request id: '.$currentId.', response id: '.$response['id'].')');
            }
            if (!
is_null($response['error'])) {
                throw new 
Exception('Request error: '.$response['error'].', message: '.$response['message']);
            }

            return 
$response['result'];

        } else {
            return 
true;
        }
    }
}
?>

Jump to: