linux下使用libcurl庫開發http請求客戶端
阿新 • • 發佈:2018-11-22
一、運用開源庫libcurl開發http請求客戶端,實現檔案上傳和字串傳送的功能
/****************************************************** *** Copyright(C) *** author Lu GuoFu *** date 2018-07-25 *******************************************************/ #include <stdio.h> #include <sys/io.h> #include <stdlib.h> #include <errno.h> #include <string.h> #include <fcntl.h> #include <sys/types.h> #include <sys/socket.h> #include <time.h> #include <curl/curl.h> #include <sys/stat.h> #include <dirent.h> #include <sys/inotify.h> #define POST_FILE_URL "127.0.0.1:8088" #define FILE_NAME "log.txt" /*********************************************** *** get_file_size *** 功能:獲取檔案的大小 *** 描述:通過該函式獲取需要上傳檔案的大小 *** 引數: *** 返回:-1 -- 獲取失敗 *** else -- 返回檔案的大小 ***********************************************/ unsigned long get_file_size(const char *fileName) { unsigned long filesize = -1; struct stat statbuff; if(stat(fileName, &statbuff) < 0) { return filesize; } else { filesize = statbuff.st_size; } return filesize; } size_t write_func(void *buffer,size_t size,size_t nmemb,void *stream) { printf("recv:%s\n",(char *)buffer); return size*nmemb; } /*********************************************** *** sendPostFile *** 功能:傳送http請求 *** 描述:通過讀取檔案的方式傳送訊息請求 *** 引數:fileName -- 待讀取檔案的名字 *** hostname -- 需要請求的域名 *** header -- 請求頭 *** 返回:-1 -- 請求失敗 *** 0 -- 請求成功 ***********************************************/ int sendPostFile(const char *fileName,const char *hostname,const char *header) { char recv[100]={0}; CURL *curl; CURLcode res; char filesize[15]={0}; struct curl_httppost *formpost=NULL; struct curl_httppost *lastptr=NULL; struct curl_slist *headerlist=NULL; //static const char buf[] = "Expect:"; curl_global_init(CURL_GLOBAL_ALL); sprintf(filesize, "%lu", get_file_size(fileName)); curl_formadd(&formpost, &lastptr, CURLFORM_COPYNAME, "logFile", CURLFORM_FILE, fileName, CURLFORM_CONTENTTYPE, "application/GWLog", CURLFORM_END); curl = curl_easy_init(); headerlist = curl_slist_append(headerlist, header); if (curl) { /* what URL that receives this POST */ curl_easy_setopt(curl, CURLOPT_URL, hostname); curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headerlist); curl_easy_setopt(curl, CURLOPT_HTTPPOST, formpost); // 設定回撥函式 curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_func); res = curl_easy_perform(curl); /* Check for errors */ if(res != CURLE_OK) { printf("curl url_easy_perform() failed:%s \n",curl_easy_strerror(res)); return -1; } else { long responseCode = 0; curl_easy_getinfo(curl, CURLINFO_RESPONSE_CODE, &responseCode); if (responseCode < 200 || responseCode >= 300) { printf("responseCode:%ld\n",responseCode); return -1; } } /* always cleanup */ curl_easy_cleanup(curl); /* then cleanup the formpost chain */ curl_formfree(formpost); /* free slist */ curl_slist_free_all (headerlist); } return 0; } /*********************************************** *** sendPostData *** 功能:傳送http請求 *** 描述:通過直接傳字串的方式傳送訊息請求 *** 引數:fileName -- 待讀取檔案的名字 *** hostname -- 需要請求的域名 *** 返回:-1 -- 請求失敗 *** 0 -- 請求成功 ***********************************************/ int sendPostData(char *data,char *dataName,char *hostname) { char recv[100]={0}; CURL *curl; CURLcode res; long namelength = strlen(dataName); struct curl_httppost *formpost=NULL; struct curl_httppost *lastptr=NULL; struct curl_slist *headerlist=NULL; static const char buf[] = "Expect:"; curl_global_init(CURL_GLOBAL_ALL); curl_formadd(&formpost, &lastptr, CURLFORM_PTRNAME, dataName, CURLFORM_PTRCONTENTS, data, CURLFORM_NAMELENGTH, namelength, CURLFORM_END); curl = curl_easy_init(); headerlist = curl_slist_append(headerlist, buf); if (curl) { // 設定超時時間為1秒 curl_easy_setopt(curl, CURLOPT_TIMEOUT, 2); /* what URL that receives this POST */ curl_easy_setopt(curl, CURLOPT_URL, hostname); curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headerlist); curl_easy_setopt(curl, CURLOPT_HTTPPOST, formpost); curl_easy_setopt(curl, CURLOPT_WRITEDATA, (void*)recv); res = curl_easy_perform(curl); /* Check for errors */ if(res != CURLE_OK) { printf("curl url_easy_perform() failed:%s \n",curl_easy_strerror(res)); return -1; } else { printf("recv:%s\n",recv); } /* always cleanup */ curl_easy_cleanup(curl); /* then cleanup the formpost chain */ curl_formfree(formpost); /* free slist */ curl_slist_free_all (headerlist); } return 0; } #if 1 int main(int argc,char *argv[]) { char *fileName = "log.txt"; char *hostname = "127.0.0.1:8088"; char *header = "Content-Type:application/json;charset=UTF-8"; int ret = sendPostFile(fileName,hostname,header); if (ret == -1) { printf("sendPostFile failed\n"); return -1; } else printf("sendPostFile success\n"); return 0; } #endif