Bitcoin Forum
April 26, 2024, 03:02:54 AM *
News: Latest Bitcoin Core release: 27.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
1714100574
Hero Member
*
Offline Offline

Posts: 1714100574

View Profile Personal Message (Offline)

Ignore
1714100574
Reply with quote  #2

1714100574
Report to moderator
1714100574
Hero Member
*
Offline Offline

Posts: 1714100574

View Profile Personal Message (Offline)

Ignore
1714100574
Reply with quote  #2

1714100574
Report to moderator
The network tries to produce one block per 10 minutes. It does this by automatically adjusting how difficult it is to produce blocks.
Advertised sites are not endorsed by the Bitcoin Forum. They may be unsafe, untrustworthy, or illegal in your jurisdiction.
1714100574
Hero Member
*
Offline Offline

Posts: 1714100574

View Profile Personal Message (Offline)

Ignore
1714100574
Reply with quote  #2

1714100574
Report to moderator
1714100574
Hero Member
*
Offline Offline

Posts: 1714100574

View Profile Personal Message (Offline)

Ignore
1714100574
Reply with quote  #2

1714100574
Report to moderator
1714100574
Hero Member
*
Offline Offline

Posts: 1714100574

View Profile Personal Message (Offline)

Ignore
1714100574
Reply with quote  #2

1714100574
Report to moderator
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!