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;
}


原文:https://blog.csdn.net/shaoyiju/article/details/78238336 

  • 0
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值