C++用libcurl通过HTTP以表单的方式Post数据到服务器

一、Post 字符串


#include <stdio.h>
#include <curl/curl.h>
 
int main(void)
{
	CURL* curl = NULL;
	CURLcode res;

	curl = curl_easy_init();
	if(curl == NULL) 
	{
		return CURLE_FAILED_INIT;
	}

	struct curl_slist* headerlist = NULL; 

	// 设置表头,表头内容可能不同
	headerlist = curl_slist_append(headerlist, "Content-Type:application/x-www-form-urlencoded");
	curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headerlist);  

	// 设置URL
	curl_easy_setopt(curl, CURLOPT_URL, "http://postit.example.com/moo.cgi");

	// 设置参数,比如"ParamName1=ParamName1Content&ParamName2=ParamName2Content&..."
	curl_easy_setopt(curl, CURLOPT_POSTFIELDS, "name=daniel&project=curl");

	// 设置为Post
	curl_easy_setopt(curl, CURLOPT_POST, 1);

	// 发送
	res = curl_easy_perform(curl);
	
	if(res != CURLE_OK)
	{
		// 获取详细错误信息
		char* szErr = curl_easy_strerror(res);
		fprintf(stderr, "curl_easy_perform() failed: %s\n", szErr);
	}

	// 清空
	curl_easy_cleanup(curl);

	// 释放表头
	curl_slist_free_all (headerlist);  
	
	return 0;
}

二、Post 文件

#include <stdio.h>
#include <curl/curl.h>

size_t OnWriteData(void* buffer, size_t size, size_t nmemb, void* lpVoid);
 
int main(void)
{
	CURL* curl = NULL;
	CURLcode res;

	curl = curl_easy_init();
	if(curl == NULL) 
	{
		return CURLE_FAILED_INIT;
	}

	struct curl_slist*		headerlist	= NULL; 
	struct curl_httppost*	formpost	= NULL;
	struct curl_httppost*	lastptr		= NULL;
	std::string strResponse;	// 回复

	curl_formadd(&formpost, &lastptr, 
		CURLFORM_COPYNAME, "ParamName1", 
		CURLFORM_COPYCONTENTS, "ParamName1Content", CURLFORM_END);

	curl_formadd(&formpost, &lastptr, 
		CURLFORM_COPYNAME, "ParamName2", 
		CURLFORM_COPYCONTENTS, "ParamName2Content", CURLFORM_END);

	curl_formadd(&formpost, &lastptr, 
		CURLFORM_COPYNAME, "ParamName3", 
		CURLFORM_COPYCONTENTS, "ParamName3Content", CURLFORM_END);

	curl_formadd(&formpost, &lastptr, 
		CURLFORM_COPYNAME, "registerImgs", 
		CURLFORM_FILE, "C:/Image.png", CURLFORM_END);	// 设置要上传的文件

	// 设置表单参数
	curl_easy_setopt(curl, CURLOPT_HTTPPOST, formpost);

	// 设置表头,表头内容可能不同
	headerlist = curl_slist_append(headerlist, "Content-Type:application/x-www-form-urlencoded");
	curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headerlist);  

	// 设置URL
	curl_easy_setopt(curl, CURLOPT_URL, "http://postit.example.com/moo.cgi");

	// 设置参数,比如"ParamName1=ParamName1Content&ParamName2=ParamName2Content&..."
	curl_easy_setopt(curl, CURLOPT_POSTFIELDS, "name=daniel&project=curl");

	// 设置为Post
	curl_easy_setopt(curl, CURLOPT_POST, 1);

	curl_easy_setopt(curl, CURLOPT_READFUNCTION, NULL);
	curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, OnWriteData);
	curl_easy_setopt(curl, CURLOPT_WRITEDATA, (void*)&strResponse);
	curl_easy_setopt(curl, CURLOPT_NOSIGNAL, 1);
	curl_easy_setopt(curl, CURLOPT_CONNECTTIMEOUT, 3);
	curl_easy_setopt(curl, CURLOPT_TIMEOUT, 3);

	// 发送
	res = curl_easy_perform(curl);
	
	if(res != CURLE_OK)
	{
		// 获取详细错误信息
		char* szErr = curl_easy_strerror(res);
		fprintf(stderr, "curl_easy_perform() failed: %s\n", szErr);
	}

	// 清空
	curl_easy_cleanup(curl);

	// 释放表单
	curl_formfree(formpost);

	// 释放表头
	curl_slist_free_all (headerlist);  
	
	return 0;
}

size_t OnWriteData(void* buffer, size_t size, size_t nmemb, void* lpVoid)
{
	std::string* str = dynamic_cast<std::string*>((std::string *)lpVoid);
	if( NULL == str || NULL == buffer )
	{
		return -1;
	}

	char* pData = (char*)buffer;
	str->append(pData, size * nmemb);
	return nmemb;
}



猜你喜欢

转载自blog.csdn.net/shaoyiju/article/details/78238336