Question:

How to call JSON RPC API from C?

Ava: 25 May 2022

How do I make RPC calls from C?

My question is related to the question: "How do I call JSON RPC API using C#? (https://bitcoin.stackexchange.com/questions/5810/how-do-i-call-json-rpc-api-using-c)"

Answer:
Alexander: 25 May 2022

The C API for processing JSON is Jansson (https://jansson.readthedocs.org/en/latest/). C applications like libblkmaker (https://github.com/bitcoin/libblkmaker) use cURL (https://en.bitcoin.it/wiki/API_reference_%28JSON-RPC%29#Command_line_.28cURL.29) for making the calls and Jansson for interpreting the JSON that cURL fetches.

For example basic usage (which can be easily modified for Bitcoin RPC), see the Jansson example github_commits.c (https://jansson.readthedocs.org/en/latest/_downloads/github_commits.c) and the associated tutorial (https://jansson.readthedocs.org/en/latest/tutorial.html#the-github-repo-commits-api).

Here's an example of how to make JSON RPC calls with cURL (https://en.bitcoin.it/wiki/API_reference_%28JSON-RPC%29#Command_line_.28cURL.29), the output of which Jansson could process:

#include <stdlib.h>

#include <curl/curl.h>

int main()
{
    CURL *curl = curl_easy_init();
    struct curl_slist *headers = NULL;

    if (curl) {
    const char *data =
        "{\"jsonrpc\": \"1.0\", \"id\":\"curltest\", \"method\": \"getinfo\", \"params\": [] }";

    headers = curl_slist_append(headers, "content-type: text/plain;");
    curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headers);

    curl_easy_setopt(curl, CURLOPT_URL, "http://127.0.0.1:8332/");

    curl_easy_setopt(curl, CURLOPT_POSTFIELDSIZE, (long) strlen(data));
    curl_easy_setopt(curl, CURLOPT_POSTFIELDS, data);

    curl_easy_setopt(curl, CURLOPT_USERPWD,
             "bitcoinrpcUSERNAME:bitcoinrpcPASSWORD");

    curl_easy_setopt(curl, CURLOPT_USE_SSL, CURLUSESSL_TRY);

    curl_easy_perform(curl);
    }
    return 0;
}

It will print, like the cURL (https://en.bitcoin.it/wiki/API_reference_%28JSON-RPC%29#Command_line_.28cURL.29) example, something like this:

{"result":{"balance":0.000000000000000,"blocks":59952,"connections":48,"proxy":"","generate":false, "genproclimit":-1,"difficulty":16.61907875185736},"error":null,"id":"curltest"}