在 C 語(yǔ)言中,使用 HTTP GET 獲取返回的數(shù)據(jù)通常需要通過(guò)一個(gè) HTTP 客戶(hù)端庫(kù)來(lái)完成。這篇文章將介紹如何使用 libcurl 庫(kù)來(lái)實(shí)現(xiàn)在 C 中進(jìn)行 HTTP GET 請(qǐng)求,并獲取一份 JSON 格式的數(shù)據(jù)。
首先,需要使用 libcurl 的初始化函數(shù)來(lái)創(chuàng)建一個(gè)缺省的 CURL 句柄:
CURL *curl = curl_easy_init();
然后,設(shè)置一些選項(xiàng),包括 URL 和一些請(qǐng)求的頭部信息。這里假設(shè)已經(jīng)有一個(gè) URL 和一些自定義的請(qǐng)求頭部,具體設(shè)置的代碼如下:
curl_easy_setopt(curl, CURLOPT_URL, "https://example.com/api/path/to/resource"); struct curl_slist *headers = NULL; headers = curl_slist_append(headers, "Content-Type: application/json;"); headers = curl_slist_append(headers, "Authorization: Bearer"); curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headers);
設(shè)置完畢之后,就可以執(zhí)行 HTTP GET 請(qǐng)求了,這里需要注意要處理一些錯(cuò)誤和異常情況,具體的代碼如下:
CURLcode res; char *response = NULL; curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_callback); curl_easy_setopt(curl, CURLOPT_WRITEDATA, &response); res = curl_easy_perform(curl); if (res != CURLE_OK) { fprintf(stderr, "curl_easy_perform() failed: %s\n", curl_easy_strerror(res)); }
其中,寫(xiě)回調(diào)函數(shù)(write_callback)被用來(lái)收集 HTTP 響應(yīng)體(即 JSON 數(shù)據(jù)),它的實(shí)現(xiàn)如下:
size_t write_callback(void *contents, size_t size, size_t nmemb, void *userp) { size_t realsize = size * nmemb; char *body = realloc(*(char **)userp, realsize + 1); if (body == NULL) { fprintf(stderr, "Not enough memory\n"); return 0; } *(char **)userp = body; memcpy(&(body[*(size_t *)userp]), contents, realsize); *(size_t *)userp += realsize; body[*(size_t *)userp] = '\0'; return realsize; }
最后,釋放所有資源:
curl_slist_free_all(headers); curl_easy_cleanup(curl);
這樣,就完成了 HTTP GET 請(qǐng)求和獲取 JSON 數(shù)據(jù)的過(guò)程。轉(zhuǎn)換成 JSON 對(duì)象后,可以根據(jù)實(shí)際需要來(lái)解析和使用。