Search code examples
phpcurljson-rpc

Get jsonRPC data with PHP curl,


Setting up a JSON-RPC on my vps which I want to connect via PHP CURL on my website doing a basic request and looking for getmasternodecount.

Tried many scripts and libraries before however none seems to work in my case. Now I try to write some basic php code, but this skill isnt my best.

<?php

error_reporting(E_ALL);
ini_set('display_errors', '1');

function coinFunction () {

    $feed = 'http://user:pass@ip/';
    $post_string = '{"method": "getmasternodecount", "params": []}';

    $ch = curl_init();

    curl_setopt($ch, CURLOPT_URL, $feed);
    curl_setopt($ch, CURLOPT_PORT, port);
    curl_setopt($ch, CURLOPT_USERPWD, "user:pass");
    curl_setopt($ch, CURLOPT_HEADER, 1); 
    curl_setopt($ch, CURLOPT_POST, 1);
    curl_setopt($ch, CURLOPT_VERBOSE, 1);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_POSTFIELDS, $post_string);
    //curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-type: application/stratum', 'Content-length: '.strlen($post_string)));
    curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-type: application/json', 'Content-length: '.strlen($post_string)));

    $output = curl_exec($ch);
    curl_close($ch);



    return $output;


}

$data = coinFunction();
var_dump($data);

echo $data;

?>

And gives me this data dump: string(127) "HTTP/1.1 403 Forbidden Date: Sun, 24 May 2020 00:06:21 GMT Content-Length: 0 Content-Type: text/html; charset=ISO-8859-1 " HTTP/1.1 403 Forbidden Date: Sun, 24 May 2020 00:06:21 GMT Content-Length: 0 Content-Type: text/html; charset=ISO-8859-1

When i delete all the var dump information etc, it send me a whitepage and sometimes NULL.

Kindly Regards,


Solution

  • Let's work with the first snippet. Since it's a POST request, file_get_contents is rather out of place here. Add the following setopt lines:

    curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($curl, CURLOPT_HEADER, 0);
    

    Without those, the result of curl_exec won't contain the returned content.

    It would also be advisable to specify the Content-Type of the request (which is application/json). The server might handle it even without, but just in case:

    curl_setopt($curl, CURLOPT_HTTPHEADER, array(
        'Content-Type:application/json'));
    

    Authentication is another thing. Credentials in the URL suggest Basic, but the server might expect otherwise... See CURLOPT_HTTPAUTH.