一、初步了解curl库
curl是一个用于传输数据的开源库,支持包括http、ftp、smtp等多种传输协议。curl库的使用可以基于curl命令行工具,也可以采用libcurl库进行开发。
在使用curl_easy_perform进行网络数据请求之前,需要先了解curl的基本概念和库函数。常用的几个函数包括:
CURLcode curl_easy_setopt(CURL *handle, CURLoption option, parameter);
CURLcode curl_easy_perform(CURL *handle);
void curl_easy_cleanup(CURL *handle);
其中,curl_easy_setopt函数用于设置curl的选项,包括url、请求头、请求方法等;curl_easy_perform函数执行网络请求,并返回结果;curl_easy_cleanup函数释放CURL对象。
下面是一个最简单的curl例子:
#include <curl/curl.h>
int main(void){
CURL *curl;
CURLcode res;
curl = curl_easy_init();
if(curl) {
curl_easy_setopt(curl, CURLOPT_URL, "http://www.google.com");
res = curl_easy_perform(curl);
if(res != CURLE_OK)
fprintf(stderr, "curl_easy_perform() failed: %s\n",curl_easy_strerror(res));
curl_easy_cleanup(curl);
}
return 0;
}
上面的例子访问了Google的主页,并通过res变量判断请求是否成功。
二、使用curl_easy_perform进行GET请求
GET请求是最简单的网络请求方式,可以通过curl_easy_setopt函数设置请求的url即可。
#include <curl/curl.h>
#include <stdio.h>
int main(){
CURL *curl;
CURLcode res;
char *data;
curl = curl_easy_init();
if(curl) {
curl_easy_setopt(curl, CURLOPT_URL, "http://www.example.com");
res = curl_easy_perform(curl);
if(res != CURLE_OK)
fprintf(stderr, "curl_easy_perform() failed: %s\n",curl_easy_strerror(res));
curl_easy_cleanup(curl);
}
return 0;
}
上面的代码使用了curl_easy_setopt(CURLOPT_URL)函数将需要请求的URL传递给CURL,然后执行请求并处理结果,最后使用curl_easy_cleanup函数释放CURL请求。
三、使用curl_easy_perform进行POST请求
POST请求需要在请求头中传递数据,需要使用curl_easy_setopt函数设置CURLOPT_POST和CURLOPT_POSTFIELDS两个选项。
#include <curl/curl.h>
#include <string.h>
#include <stdio.h>
int main()
{
CURL *curl;
CURLcode res;
char *data = "name=Bob&age=20";
curl = curl_easy_init();
if(curl) {
curl_easy_setopt(curl, CURLOPT_URL, "http://www.example.com");
curl_easy_setopt(curl, CURLOPT_POSTFIELDS, data);
curl_easy_setopt(curl, CURLOPT_POST, 1L);
res = curl_easy_perform(curl);
if(res != CURLE_OK)
fprintf(stderr, "curl_easy_perform() failed: %s\n",curl_easy_strerror(res));
curl_easy_cleanup(curl);
}
return 0;
}
上面的代码使用了curl_easy_setopt(CURLOPT_POSTFIELDS)函数设置请求体,并使用curl_easy_setopt(CURLOPT_POST)函数告知curl发送POST请求。
四、使用curl_easy_perform进行文件下载
文件下载可以使用libcurl库提供的CURLOPT_WRITEFUNCTION回调函数。该函数需要指定一个可执行指针,用于接收下载的数据并保存到本地文件中。以下是一个简单的文件下载示例:
#include <curl/curl.h>
#include <stdio.h>
size_t write_data(void *ptr, size_t size, size_t nmemb, FILE *stream){
return fwrite(ptr, size, nmemb, stream);
}
int main(){
CURL *curl;
CURLcode res;
curl = curl_easy_init();
if(curl) {
FILE *fp;
fp = fopen("example.jpg", "wb");
curl_easy_setopt(curl, CURLOPT_URL, "http://www.example.com/example.jpg");
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_data);
curl_easy_setopt(curl, CURLOPT_WRITEDATA, fp);
res = curl_easy_perform(curl);
if(res != CURLE_OK)
fprintf(stderr, "curl_easy_perform() failed: %s\n",curl_easy_strerror(res));
curl_easy_cleanup(curl);
fclose(fp);
}
return 0;
}
上面的代码中,write_data函数即为CURLOPT_WRITEFUNCTION回调函数,将下载数据保存到本地example.jpg文件中。curl_easy_setopt(CURLOPT_WRITEDATA)函数指定回调函数输出文件。
五、使用curl_easy_perform进行访问HTTPS
访问HTTPS需要开启TLS/SSL支持,主要包括以下几个步骤:
- 引入openssl库头文件
- 开启CURLOPT_SSL_VERIFYPEER选项
- 设置CURLOPT_CAINFO选项
- 设置CURLOPT_SSLCERT和CURLOPT_SSLKEY选项(可选)
以下是一个访问HTTPS网站的示例:
#include <curl/curl.h>
#include <stdio.h>
int main(){
CURL *curl;
CURLcode res;
curl_global_init(CURL_GLOBAL_SSL);
curl = curl_easy_init();
if(curl) {
curl_easy_setopt(curl, CURLOPT_URL, "https://www.example.com");
curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, 1L);
curl_easy_setopt(curl, CURLOPT_CAINFO, "/path/to/cert.pem");
res = curl_easy_perform(curl);
if(res != CURLE_OK)
fprintf(stderr, "curl_easy_perform() failed: %s\n",curl_easy_strerror(res));
curl_easy_cleanup(curl);
}
return 0;
}
上面的代码中,使用curl_global_init(CURL_GLOBAL_SSL)函数初始化curl库,然后开启CURLOPT_SSL_VERIFYPEER选项。另外,需要设置CURLOPT_CAINFO选项,用于指定证书文件,CURLOPT_SSLCERT和CURLOPT_SSLKEY可选。