Bitcoin Forum
November 04, 2024, 06:39:55 PM *
News: Latest Bitcoin Core release: 28.0 [Torrent]
 
   Home   Help Search Login Register More  
Pages: [1]
  Print  
Author Topic: BitcoinQt RPC Php script not connecting Exception: Incorrect response id  (Read 7341 times)
Backedbit (OP)
Newbie
*
Offline Offline

Activity: 3
Merit: 0


View Profile
March 25, 2013, 08:27:41 PM
 #1

Can anyone figure out what's wrong with my php script? The rpc client uses curl to do an http request. The screen output is:

Exception: Incorrect response id (request id: 1, response id: <) in C:\wamp\www\curlsome.php on line 149


SCRIPT CODE:

 <?php
    require_once 'curlsome.php';
  $bitcoin = new jsonRPCClient('http://localhost:18332', 'user1', 'password1');
  echo "<pre>\n";
   print_r($bitcoin->getinfo()); echo "\n";
  echo "</pre>";
?>



CLIENT CODE:


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
      $opts = array ('http' => array (
                     'method'  => 'POST',
                     'header'  => 'Content-type: application/json',
                     'content' => $request
                     ));
      $context  = stream_context_create($opts);
      if ($fp = fopen($this->url, 'r', false, $context)) {
         $response = '';
         while($row = fgets($fp)) {
            $response.= trim($row)."\n";
         }
         $this->debug && $this->debug.='***** Server response *****'."\n".$response.'***** End of server response *****'."\n";
         $response = json_decode($response,true);
      } else {
         throw new Exception('Unable to connect to '.$this->url);
      }
      
      // debug output
      if ($this->debug) {
         echo nl2br($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']);
         }
         
         return $response['result'];
         
      } else {
         return true;
      }
   }
}
?>

Much thanks,

Backedbit
MaxCoins
Member
**
Offline Offline

Activity: 83
Merit: 10


View Profile
March 25, 2013, 08:31:19 PM
 #2

Funny you should post this just now. I was just googling to see if there were any PHP scripts out there for getting MtGox data.

Did you write this from scratch or find it elsewhere?


Thanks
MaxCoins
Member
**
Offline Offline

Activity: 83
Merit: 10


View Profile
March 25, 2013, 08:34:43 PM
 #3

Ooops! Should have read it more carefully.

Are there any existing PHP scripts that utilize the MtGox API that anyone can point me to?
MaxCoins
Member
**
Offline Offline

Activity: 83
Merit: 10


View Profile
March 25, 2013, 08:46:22 PM
 #4

What I would like to do is collect and track trading data so I can analyze it. I can write it from scratch but I'm sure someone has already written some scripts that have similar functionality - it's almost always the case in such situations, in my experience.

Thanks
MaxCoins
Member
**
Offline Offline

Activity: 83
Merit: 10


View Profile
March 25, 2013, 08:48:12 PM
 #5

Or maybe that data is already publicly available somewhere and I am being an idiot.  Wink
MaxCoins
Member
**
Offline Offline

Activity: 83
Merit: 10


View Profile
March 25, 2013, 08:52:38 PM
 #6

Thanks for the offer but its not something I would pay for at this point - more just a matter of curiosity.
Backedbit (OP)
Newbie
*
Offline Offline

Activity: 3
Merit: 0


View Profile
March 25, 2013, 10:11:53 PM
 #7

thanks, though I pasted the wrong rpc client. Here is the one I meant to paste. It uses curl (below) and gets the screen output errors described earlier:

thanks.  (btw, the changes mentioned earlier worked for my local server, but not with online connections??)


 <?php
   
    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
                   
                  //  $this->id = rand(0,99999);
                    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_RETURNTRANSFER, true);
                    curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type: application/json'));
                    curl_setopt($ch, CURLOPT_POST, true);
                    curl_setopt($ch, CURLOPT_POSTFIELDS, $request);
                   // $response = json_decode(curl_exec($ch),true);

                   $response = curl_exec($ch);
                   json_decode($response, true);

                    curl_close($ch);

                    // debug output
                   // if ($this->debug) {
                     //       echo ($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']);
                            }
                           
                            return $response['result'];
                           
                    } else {
                            return true;
                    }
            }
    }
    ?>
tutkarz
Hero Member
*****
Offline Offline

Activity: 546
Merit: 501


View Profile
March 26, 2013, 06:46:55 AM
Last edit: March 26, 2013, 08:24:49 AM by tutkarz
 #8

I also had problems with code you posted, so i switched to this and it is working for me (json 2.0).
source from: http://ptrofimov.wordpress.com/2011/04/27/php-class-to-implement-json-rpc-2-0-protocol/

Code:
<?php
/**
 * Class to call remote methods via protocol JSON-RPC 2.0
 * Includes server and client functionality
 *
 * According to official JSON-RPC 2.0 specification
 * http://groups.google.com/group/json-rpc/web/json-rpc-2-0
 * Excluding "notifications" and "batch mode"
 *
 * Usage example:
 *
 * 1. Server
 *
 * class JsonRpcServer
 * {
 * public function add( $a, $b )
 * {
 * return $a + $b;
 * }
 * }
 *
 * $server = new JsonRpc( new JsonRpcServer() );
 * $server->process();
 *
 * 2. Client
 *
 * $client = new JsonRpc( 'http://[SERVER]/json_rpc_server.php' );
 * $result = $client->add( 2, 2 ); // returns 4
 *
 * @author ptrofimov
 */
class JsonRpc
{
const JSON_RPC_VERSION '2.0';

private $_server_url$_server_object;

public function __construct$pServerUrlOrObject )
{
if ( is_string$pServerUrlOrObject ) )
{
if ( !$pServerUrlOrObject )
{
throw new Exception'URL string can\'t be empty' );
}
$this->_server_url $pServerUrlOrObject;
}
elseif ( is_object$pServerUrlOrObject ) )
{
$this->_server_object $pServerUrlOrObject;
}
else
{
throw new Exception'Input parameter must be URL string or server class object' );
}
}

public function __call$pMethod, array $pParams )
{
if ( is_null$this->_server_url ) )
{
throw new Exception'This is server JSON-RPC object: you can\'t call remote methods' );
}
$request = new stdClass();
$request->jsonrpc self::JSON_RPC_VERSION;
$request->method $pMethod;
$request->params $pParams;
$request->id md5uniqidmicrotimetrue ), true ) );
$request_json json_encode$request );
$ch curl_init();
curl_setopt_array$ch,
array( CURLOPT_URL => $this->_server_urlCURLOPT_HEADER => 0CURLOPT_POST => 1,
CURLOPT_POSTFIELDS => $request_jsonCURLOPT_RETURNTRANSFER => ) );
$response_json curl_exec$ch );
if ( curl_errno$ch ) )
{
throw new Exceptioncurl_error$ch ), curl_errno$ch ) );
}
if ( curl_getinfo$chCURLINFO_HTTP_CODE ) != 200 )
{
throw new Exceptionsprintf'Curl response http error code "%s"',
curl_getinfo$chCURLINFO_HTTP_CODE ) ) );
}
curl_close$ch );
$response $this->_parseJson$response_json );
$this->_checkResponse$response$request );
return $response->result;
}

public function process()
{
if ( is_null$this->_server_object ) )
{
throw new Exception'This is client JSON-RPC object: you can\'t process request' );
}
ob_start();
$request_json file_get_contents'php://input' );
$response = new stdClass();
$response->jsonrpc self::JSON_RPC_VERSION;
try
{
$request $this->_parseJson$request_json );
$this->_checkRequest$request );
$response->result call_user_func_array(
array( $this->_server_object$request->method ), $request->params );
$response->id $request->id;
}
catch ( Exception $ex )
{
$response->error = new stdClass();
$response->error->code $ex->getCode();
$response->error->message $ex->getMessage();
$response->id null;
}
ob_clean();
echo json_encode$response );
//echo $response;
}

private function _parseJson$pData )
{
$data json_decode$pData );//, false); //, 32 );
if ( is_null$data ) )
{
throw new Exception'Parse error', -32700 );
}
return $data;
}

private function _checkRequest$pObject )
{
if ( !is_object$pObject ) || !isset( $pObject->jsonrpc ) || $pObject->jsonrpc !== self::JSON_RPC_VERSION || !isset(
$pObject->method ) || !is_string$pObject->method ) || !$pObject->method || ( isset(
$pObject->params ) && !is_array$pObject->params ) ) || !isset( $pObject->id ) )
{
throw new Exception'Invalid Request', -32600 );
}
if ( !is_callable( array( $this->_server_object$pObject->method ) ) )
{
throw new Exception'Method not found', -32601 );
}
if ( is_null$pObject->params ) )
{
$pObject->params = array();
}
}

private function _checkResponse$pObject$pRequest )
{
if ( !is_object$pObject ) || !isset( $pObject->jsonrpc ) || $pObject->jsonrpc !== self::JSON_RPC_VERSION || ( !isset(
$pObject->result ) && !isset( $pObject->error ) ) || ( isset( $pObject->result ) && ( !isset(
$pObject->id ) || $pObject->id !== $pRequest->id ) ) || ( isset( $pObject->error ) && ( !is_object(
$pObject->error ) || !isset( $pObject->error->code ) || !isset( $pObject->error->message ) ) ) )
{
throw new Exception'Invalid Response', -32600 );
}
if ( isset( $pObject->error ) )
{
throw new Exception$pObject->error->message$pObject->error->code );
}
}
}

Pages: [1]
  Print  
 
Jump to:  

Powered by MySQL Powered by PHP Powered by SMF 1.1.19 | SMF © 2006-2009, Simple Machines Valid XHTML 1.0! Valid CSS!