1. 程式人生 > >linux下使用libcurl庫開發http請求客戶端

linux下使用libcurl庫開發http請求客戶端

一、運用開源庫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