在C語言中,處理JSON格式的數據通常是一項繁瑣的工作。為了簡化這個過程,許多開發人員選擇使用現有的庫來完成這項工作。在這里我們將介紹一款常用的JSON RPC庫。
#include <jansson.h> #include <curl/curl.h> #define RPC_URL "http://localhost:8080/rpc" /* * 發送JSON RPC請求 */ json_t *send_json_rpc(const char *method, json_t *params) { CURL *curl; CURLcode res; struct curl_slist *headers = NULL; json_t *req, *res_obj; char *req_str, error[CURL_ERROR_SIZE]; curl = curl_easy_init(); if (curl) { // 設置請求頭 headers = curl_slist_append(headers, "Content-Type: application/json"); curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headers); // 生成JSON RPC請求 req = json_pack("{s:s,s:o,s:i}", "jsonrpc", "2.0", "params", params, "id", 1); json_object_set_new(req, "method", json_string(method)); req_str = json_dumps(req, JSON_ENSURE_ASCII); curl_easy_setopt(curl, CURLOPT_URL, RPC_URL); curl_easy_setopt(curl, CURLOPT_POSTFIELDS, req_str); curl_easy_setopt(curl, CURLOPT_ERRORBUFFER, error); // 發送請求 res = curl_easy_perform(curl); if (res != CURLE_OK) { fprintf(stderr, "curl_easy_perform() failed: %s\n", curl_easy_strerror(res)); json_decref(req); return NULL; } // 解析響應 json_error_t err; res_obj = json_loads(error, JSON_DECODE_ANY, &err); if (res_obj == NULL) { fprintf(stderr, "json_loads() failed: %s\n", err.text); } // 釋放資源 curl_slist_free_all(headers); json_decref(req); curl_easy_cleanup(curl); free(req_str); return res_obj; } return NULL; } int main() { json_t *params = json_pack("[i]", 1); json_t *result = send_json_rpc("add", params); if (result != NULL) { int sum; json_unpack(result, "{s:i}", "result", &sum); printf("Result: %d\n", sum); json_decref(result); json_decref(params); } return 0; }
上述代碼中,我們使用了libcurl和jansson這兩個常用的C語言庫。其中,libcurl用于發送HTTP請求,jansson則用于處理JSON格式的數據。
send_json_rpc()函數用于發送一個JSON RPC請求,并返回響應結果。參數method表示要調用的RPC方法,params為該方法的參數。
在main()函數中,我們生成了一個包含一個整數參數1的JSON對象,并調用了send_json_rpc()函數來執行名為“add”的RPC方法,并輸出結果。操作過程十分簡單易懂。