代码如下:
#include <stdio.h>
#include "curl/curl.h"
#include <unistd.h>
int http_postRequest(const char *data, const char *url, curl_write_callback write_callback)
{
int ret = -1;
CURL *curl = NULL;
struct curl_slist *headers = NULL;
curl = curl_easy_init();
if (!curl)
{
printf("curl_easy_init failed.");
goto label;
}
/*
* 构建http报文头
*/
headers = curl_slist_append(headers, "Content-Type:application/json; charset=UTF-8");
if (headers == NULL)
{
printf("curl_slist_append failed.\n");
goto label;
}
curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headers);
curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, 0); // 是否验证服务器SSL证书的有效性 0:不验证 1:验证
curl_easy_setopt(curl, CURLOPT_SSL_VERIFYHOST, 0); // 是否检查服务器的SSL证书中的主机名与请求的主机名匹配 0:不检查 2:检查
// curl_easy_setopt(curl, CURLOPT_CAINFO, ""); // 指定CA证书的位置
curl_easy_setopt(curl, CURLOPT_URL, url); // url地址
curl_easy_setopt(curl, CURLOPT_POSTFIELDS, data); // post数据
// curl_easy_setopt(curl, CURLOPT_WRITEDATA, args);//传递给 write_callback() 回调函数的第四个参数
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_callback); // 接受数据回调
curl_easy_setopt(curl, CURLOPT_POST, 1); // post请求
curl_easy_setopt(curl, CURLOPT_VERBOSE, 0); // 是否打印调试信息
curl_easy_setopt(curl, CURLOPT_HEADER, 0); // 是否输出响应头
curl_easy_setopt(curl, CURLOPT_TIMEOUT, 10); // 设置整个cURL函数执行过程的最长等待时间,单位:秒
ret = curl_easy_perform(curl);
if (ret != CURLE_OK)
{
printf("curl error code: %d\n", ret);
}
label:
if (headers)
{
curl_slist_free_all(headers);
}
if (curl)
{
curl_easy_cleanup(curl);
}
return ret;
}
int progress_callback(void *p, curl_off_t dltotal, curl_off_t dlnow, curl_off_t ultotal, curl_off_t ulnow)
{
if (dltotal != 0)
{
printf("Download progress: %3.0f%%\n", (dlnow / (dltotal * 1.00)) * 100);
}
return 0;
}
int http_download(const char *url, const char *path)
{
int ret = -1;
FILE *fp = NULL;
CURL *curl = NULL;
fp = fopen(path, "wb");
if (!fp)
{
printf("fopen failed.");
goto label;
}
curl = curl_easy_init();
if (!curl)
{
printf("curl_easy_init failed.");
goto label;
}
curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, 0);
curl_easy_setopt(curl, CURLOPT_SSL_VERIFYHOST, 0);
curl_easy_setopt(curl, CURLOPT_URL, url);
curl_easy_setopt(curl, CURLOPT_WRITEDATA, fp);
/*
* CURLOPT_WRITEFUNCTION 可以不用设置,curl会调用默认的回调函数,
* 把数据写入fp所指向的文件中。
*/
// curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_callback);
curl_easy_setopt(curl, CURLOPT_NOPROGRESS, 0);
// curl_easy_setopt(curl, CURLOPT_PROGRESSDATA, args); //传递给 progress_callback() 回调函数的第一个参数
curl_easy_setopt(curl, CURLOPT_XFERINFOFUNCTION, progress_callback);
curl_easy_setopt(curl, CURLOPT_TIMEOUT, 60 * 10);
ret = curl_easy_perform(curl);
if (ret != CURLE_OK)
{
printf("curl error code: %d\n", ret);
}
label:
if (curl)
{
curl_easy_cleanup(curl);
}
if (fp)
{
fclose(fp);
}
return ret;
}
size_t curl_recv_callback(char *buffer, size_t size, size_t nitems, void *outstream)
{
printf("recv: %s\n", buffer);
return size * nitems;
}
int main(void)
{
if (curl_global_init(CURL_GLOBAL_ALL) != CURLE_OK)
{
printf("curl_global_init failed.");
return -1;
}
// curl_version_info_data *version_info = curl_version_info(CURLVERSION_NOW);
// printf("线程安全: %s\n", (version_info->features & CURL_VERSION_THREADSAFE) ? "enabled" : "disabled");
printf("开始HTTP请求:\n");
http_postRequest("", "www.baidu.com", curl_recv_callback);
sleep(3);
printf("开始文件下载:\n");
http_download("http://clips.vorwaerts-gmbh.de/big_buck_bunny.mp4",
"./big_buck_bunny.mp4");
curl_global_cleanup();
return 0;
}