详解libcurl Easy interface API(C++)
libcurl是一个功能强大且广泛使用的开源网络传输库,提供了Easy interface API,用于简化网络请求的创建和管理。Easy interface API允许开发者使用简单的函数调用来实现各种网络传输操作,包括发送HTTP请求、下载文件、处理FTP连接等。
通过libcurl的Easy interface API,开发者可以轻松地进行网络通信,无论是与远程服务器进行数据交换,还是从网络上下载文件。以下是Easy interface API的主要功能和用法:
-
初始化和清理:使用curl_easy_init()函数初始化一个CURL句柄,通过curl_easy_cleanup()函数进行清理。
-
设置URL和选项:使用curl_easy_setopt()函数来设置网络请求的URL、请求方法(GET、POST等)以及其他选项,如请求头、超时时间、SSL配置等。
-
执行请求:通过调用curl_easy_perform()函数来执行网络请求。该函数会阻塞当前线程,直到请求完成或发生错误。
-
处理响应:可以通过设置回调函数来处理服务器返回的数据。使用curl_easy_setopt()函数设置CURLOPT_WRITEFUNCTION选项,并指定一个回调函数来接收响应数据。
-
错误处理:libcurl会返回一个CURLcode错误代码,开发者可以使用curl_easy_strerror()函数将其转换为可读的错误信息。
除了以上主要功能,Easy interface API还提供了其他一些有用的函数和选项,如设置代理、处理重定向、使用Cookie等。
总之,libcurl的Easy interface API提供了简单而强大的方法来进行网络通信,使开发者能够更轻松地实现各种网络传输操作。无论是初学者还是有经验的开发人员,都可以通过这个API轻松地在应用程序中集成网络功能。
1、curl_global_init
函数
curl_global_init()
是libcurl库中的一个函数,该函数用于全局初始化curl库。
函数原型如下:
CURLcode curl_global_init(long flags);
参数:
参数
flags
是一个标志位,用于设置全局初始化的选项。常用的选项包括:
- CURL_GLOBAL_ALL: 初始化所有的支持的功能,包括线程安全、DNS解析、SSL等。
- CURL_GLOBAL_SSL: 只初始化SSL相关的功能。
- CURL_GLOBAL_WIN32: 只适用于Windows平台,初始化适用于Win32的功能。
- CURL_GLOBAL_NOTHING: 表示libcurl在全局初始化时不初始化任何功能。此选项会禁用libcurl的所有功能,包括线程安全、DNS解析和SSL等。使用此选项进行全局初始化后,你将无法使用libcurl库提供的任何网络传输功能。
返回值:
函数返回值为
CURLcode
类型的错误代码。返回值为
CURLE_OK
表示初始化成功,其他返回值表示初始化过程中出现了错误。
全局初始化只需在程序启动时调用一次,不需要在每个curl_easy_init()函数调用之前都进行初始化。如果多次调用curl_global_init()函数,libcurl会自动处理多次调用的情况。
以下是一个示例代码:
#include <stdio.h>
#include <curl/curl.h>
int main() {
CURLcode result = curl_global_init(CURL_GLOBAL_ALL);
if (result != CURLE_OK) {
fprintf(stderr, "curl_global_init() failed: %s\n", curl_easy_strerror(result));
return 1;
// perform other libcurl operations
curl_global_cleanup();
return 0;
}
上述示例代码中,使用
CURL_GLOBAL_ALL
标志进行全局初始化,然后执行其他的libcurl操作。最后,在程序退出前调用
curl_global_cleanup()
函数进行清理操作。
2、curl_global_cleanup
函数
curl_global_cleanup()
是libcurl库中的一个函数,用于进行全局清理。
函数原型如下:
void curl_global_cleanup(void);
该函数用于清理和释放libcurl库的全局资源。在程序退出之前,应调用该函数来确保释放libcurl占用的系统资源。
请注意,
curl_global_cleanup()
函数应在最后一个
curl_easy_cleanup()
函数调用之后进行调用。如果在调用
curl_easy_cleanup()
之后还有其他libcurl操作,那么不应该调用
curl_global_cleanup()
函数,因为全局清理将关闭所有的libcurl句柄和资源。
需要注意的是,全局清理是可选的。如果没有进行全局初始化
curl_global_init()
,则无需调用
curl_global_cleanup()
。但如果进行了全局初始化,则应在程序退出时调用全局清理函数,以确保正确释放资源。
3、curl_easy_init()
函数
curl_easy_init()
是libcurl库中的一个函数,用于创建并返回一个CURL句柄,用于执行curl请求。调用
curl_easy_init()
函数会分配并返回一个CURL句柄,该句柄可以用于执行各种curl请求操作,如发送HTTP请求、获取响应、设置请求选项等。
函数原型如下:
CURL *curl_easy_init(void);
参数:
- 无
返回:
- 该函数返回一个指向CURL会话句柄的指针,如果初始化成功,将返回非NULL的指针;否则返回NULL指针。
4、curl_easy_cleanup()
函数
curl_easy_cleanup()
是libcurl库中的一个函数,用于清理和释放由
curl_easy_init()
函数创建的一个CURL句柄。
函数原型如下:
void curl_easy_cleanup(CURL *handle);
参数
handle
是一个指向CURL句柄的指针,表示需要清理和释放的句柄。
调用
curl_easy_cleanup()
函数后,该句柄及其相关资源将被释放,并且不再可用于执行curl请求。
以下是一个示例代码:
需要注意的是,
curl_easy_cleanup()
函数应在不再需要使用CURL句柄之后进行调用。在调用该函数之后,句柄将不再有效,不能再使用句柄执行任何curl操作。
另外,如果在程序中有多个CURL句柄,每个句柄都需要调用
curl_easy_cleanup()
进行清理和释放。不应该将同一个句柄传递给多个
curl_easy_cleanup()
函数调用。
5、curl_easy_setopt
curl_easy_setopt()
是libcurl库中的一个C API函数,用于设置CURL会话的各种选项。通过该函数,可以设置URL、请求头、请求方法、超时时间等等。
函数原型如下:
CURLcode curl_easy_setopt(CURL *handle, CURLoption option, parameter);
- handle:CURL会话句柄,即通过curl_easy_init()函数初始化得到的指针。
- option:要设置的选项,是一个预定义的枚举值,表示需要设置的具体选项。
- parameter:选项的参数值,根据具体的选项而不同。
CURLoption
是一个枚举类型,用于表示
curl_easy_setopt
函数中的选项类型。它定义了各种不同的选项,以指定要设置的具体行为或配置。
以下是对一些常见的
CURLoption
选项的参数进行介绍:
分类:URL相关参数
-
CURLOPT_URL
:参数为字符串类型,用于设置要处理的URL地址。 -
CURLOPT_HTTPGET
:默认为0。设置为1表示发起一次GET请求。 -
CURLOPT_POST
:指定是否使用HTTP POST方法。默认为0,设置为1表示发起一次POST请求。 -
CURLOPT_POSTFIELDS
:参数为字符串类型,用于提交HTTP的POST请求的数据。 -
CURLOPT_COOKIE
:参数为字符串类型,设置HTTP头中的Cookie信息。 -
CURLOPT_COOKIEFILE
:参数为字符串类型,与CURLOPT_COOKIE
类似,不过Cookie信息从文件中读取。 -
CURLOPT_TIMEOUT
:参数为long数值类型,用于设置函数执行的最长时间,单位为秒。 -
CURLOPT_CONNECTTIMEOUT
:参数为long数值类型,用于设置连接服务器的最长时间,单位为秒。设置为0表示无限长。 -
CURLOPT_MAX_RECV_SPEED_LARGE
:参数为curl_off_t类型,指定下载过程中的最大速度,单位为字节/秒。 -
CURLOPT_NOPROGRESS
:布尔值类型,默认为1。关闭CURL传输显示的进度条。
分类:调试和信号处理参数
-
CURLOPT_VERBOSE
:默认为0。打开或关闭详细模式,参数设置为1可使库显示有关操作的详细信息。 -
CURLOPT_NOSIGNAL
:默认为0。控制是否使用信号处理函数。 -
CURLOPT_TCP_NODELAY
:默认为1。控制是否关闭TCP的Nagle算法。 -
CURLOPT_TCP_KEEPALIVE
:默认为0。控制是否开启TCP的keep-alive功能。 -
CURLOPT_TCP_KEEPIDLE
:默认为60秒。设置TCP的keep-alive空闲时间等待。 -
CURLOPT_TCP_KEEPINTVL
:默认为60秒。设置TCP的keep-alive间隔时间。
分类:SSL参数
-
CURLOPT_SSL_CIPHER_LIST
:传递一个指向零终止的字符串,包含用于SSL连接的密码列表。 -
CURLOPT_SSL_VERIFYPEER
:默认为1。控制是否验证对端的SSL证书。 -
CURLOPT_SSL_VERIFYHOST
:默认为2。控制是否验证证书的名字和URL中的服务器是否匹配。
分类:请求头信息参数
-
CURLOPT_HEADER
:默认为0。指定写回调函数WRITEFUNCTION
是否包含报文的头部信息。
-
CURLOPT_HTTPHEADER
:CURLOPT_HTTPHEADER
是一个curl_slist
结构体类型的参数,它允许用户自定义HTTP请求的头信息。HTTP头部用于在请求中传递额外的信息,如身份验证凭据、自定义标头字段等。
- 使用CURLOPT_HTTPHEADER参数,可以设置多个自定义的HTTP头信息,每个头信息都需要使用curl_slist结构体表示。可以使用curl_slist_append函数向curl_slist结构体中添加头信息,并将该结构体设置为CURLOPT_HTTPHEADER选项的值。
例如,以下代码段演示了如何设置自定义的HTTP头信息:
// 创建一个curl_slist结构体
struct curl_slist *header = NULL;
// 添加自定义的头信息
header = curl_slist_append(header, "Content-Type: application/json");
header = curl_slist_append(header, "Authorization: Bearer your_token");
// 设置CURLOPT_HTTPHEADER选项
curl_easy_setopt(curl, CURLOPT_HTTPHEADER, header);
在上面的示例中,我们通过curl_slist_append将两个自定义的头信息添加到curl_slist结构体中,然后使用curl_easy_setopt函数将该curl_slist结构体设置为CURLOPT_HTTPHEADER选项的值。
这样,每次使用cURL进行HTTP请求时,请求头信息中就会包含我们自定义的头信息,以便传递额外的信息给服务器。请注意,在设置CURLOPT_HTTPHEADER时,要确保在请求之前设置好,并在请求完成后释放curl_slist结构体的内存。
总结:CURLOPT_HTTPHEADER参数允许用户自定义HTTP请求的头信息,通过设置curl_slist结构体来添加和管理自定义的头信息。这使得在发送请求时可以传递额外的信息给服务器。
分类:回调
1、
CURLOPT_WRITEFUNCTION
:用于设置一个回调函数,用于接收从服务器接收到的响应数据。
CURLcode curl_easy_setopt(CURL *handle, CURLOPT_WRITEFUNCTION, write_callback);
在使用
curl_easy_setopt
函数时,你可以使用
CURLOPT_WRITEFUNCTION
选项来指定一个函数,用于处理响应数据。这个函数的原型应该符合以下形式:
size_t write_callback(void *ptr, size_t size, size_t nmemb, void *userdata);
-
ptr
:指向接收到的数据的指针。 -
size
:每个数据块的大小(以字节计算)。 -
nmemb
:数据块的数量。 -
userdata
:用户定义的指针,用于传递额外的数据或上下文(可选)。
回调函数应该返回实际处理的数据的大小(以字节为单位)。如果返回的大小与
size * nmemb
不同,libcurl会将处理的数据大小视为错误,并终止传输。
通过使用
CURLOPT_WRITEFUNCTION
选项,你可以自定义处理接收到的响应数据的方式。例如,你可以将接收到的数据保存到文件中、将其传递给其他处理函数,或者进行其他逻辑处理。
一旦设置了
CURLOPT_WRITEFUNCTION
选项,并且已经设置了接收数据的目的地(例如使用
CURLOPT_WRITEDATA
选项设置了指向文件的指针),libcurl将在接收到数据时调用该回调函数,并传递相应的参数。
请注意,在回调函数中处理数据时,确保处理的方式与数据的类型和格式相匹配,以避免错误和数据损坏。
-
CURLOPT_WRITEDATA
:设置CURLOPT_WRITEFUNCTION
回调函数的用户数据指针。
-
当使用
curl_easy_setopt
函数设置CURLOPT_WRITEFUNCTION
选项时,你可以使用CURLOPT_WRITEDATA
选项来设置一个指针,该指针将在调用CURLOPT_WRITEFUNCTION
回调函数时传递给该函数的userdata
参数。
CURLOPT_WRITEDATA
选项的值应该是一个指针,指向你想要传递给CURLOPT_WRITEFUNCTION
回调函数的用户数据。
这个用户数据指针是可选的,你可以根据需要选择使用它。它可以用于传递额外的上下文信息、指向数据结构的指针或其他用途。
在CURLOPT_WRITEFUNCTION
回调函数中,你可以通过userdata
参数访问和操作这个用户数据指针的值。
请注意,要确保在使用CURLOPT_WRITEDATA
设置指针之前,这个指针已经被初始化或指向有效的内存地址。并且,当不再需要使用该指针时,要小心释放或清理相关资源,以避免内存泄漏和其他问题。
-
CURLOPT_READFUNCTION
:
-
数据上传的读取回调,用于设置一个回调函数,该函数被用于提供要发送给服务器的请求数据。
在使用curl_easy_setopt
函数时,可以使用CURLOPT_READFUNCTION
选项指定一个回调函数,该函数负责提供要发送到服务器的请求数据。回调函数的原型应满足以下形式:
c size_t read_callback(void *ptr, size_t size, size_t nmemb, void *userdata);
回调函数的参数含义如下:
-
ptr
:指向缓冲区的指针,用于在回调函数中存储要发送的数据。 -
size
:每个数据块的大小(以字节为单位)。 -
nmemb
:数据块的数量。 -
userdata
:用户定义的指针,用于传递额外的数据或上下文(可选)。
回调函数应该将要发送的数据复制到
ptr
指向的缓冲区,并返回实际复制的数据大小(以字节为单位)。如果返回的大小与
size * nmemb
不同,libcurl将视为错误并终止传输。
通过使用
CURLOPT_READFUNCTION
选项,你可以自定义提供请求数据的方式。例如,你可以从文件中读取数据、从内存中提供数据,或者通过其他逻辑生成数据。
一旦设置了
CURLOPT_READFUNCTION
选项,并且设置了读取数据的来源(例如使用
CURLOPT_READDATA
选项设置指向数据的指针),libcurl将在需要发送请求数据时调用该回调函数,并传递相应的参数。
请注意,在回调函数中处理数据时,确保提供的数据与服务器期望的数据类型和格式相匹配,以避免错误和数据损坏。同时,确保在没有数据可提供时正确处理返回值,例如返回0表示无数据可供发送。
另外,注意在使用
CURLOPT_READFUNCTION
选项时,通常也需要设置
CURLOPT_UPLOAD
选项为1,以指示进行上传操作。
-
CURLOPT_READDATA
用于设置CURLOPT_READFUNCTION
回调函数的用户数据指针。
-
当使用
curl_easy_setopt
函数设置CURLOPT_READFUNCTION
选项时,你可以使用CURLOPT_READDATA
选项来设置一个指针,该指针将在调用CURLOPT_READFUNCTION
回调函数时传递给该函数的userdata
参数。
-
CURLOPT_READDATA
选项的值应该是一个指针,指向你想要传递给CURLOPT_READFUNCTION
回调函数的用户数据。 - 这个用户数据指针是可选的,你可以根据需要选择使用它。它可以用于传递额外的上下文信息、指向数据结构的指针或其他用途。
-
在
CURLOPT_READFUNCTION
回调函数中,你可以通过userdata
参数访问和操作这个用户数据指针的值。 -
请注意,在使用
CURLOPT_READDATA
设置指针之前,要确保指针已经被初始化或指向有效的内存地址。当不再需要使用该指针时,要小心释放或清理相关资源,以避免内存泄漏和其他问题。同时,在回调函数中,确保使用的数据来源和指针的生命周期与CURLOPT_READDATA
设置的一致,以避免潜在的问题。
-
CURLOPT_HEADERFUNCTION
(报文头回调函数指针)
-
CURLOPT_HEADERFUNCTION是一个函数指针参数,用于设置接收报文头信息的回调函数。当使用cURL进行HTTP请求时,服务器的响应中包含了报文头(header),该参数允许用户定义一个回调函数来处理这些报文头信息。
在设置CURLOPT_HEADERFUNCTION时,需要提供一个函数指针,指向一个自定义的回调函数。该回调函数需要满足以下原型:
cpp size_t header_callback(char *buffer, size_t size, size_t nitems, void *userdata);
回调函数的参数说明如下:
-
buffer
:指向接收到的报文头数据的缓冲区。 -
size
:每个数据块的大小(字节数)。 -
nitems
:数据块的数量。 -
userdata
:用户自定义数据指针,可以在回调函数中使用。
回调函数需要返回一个size_t类型的值,表示实际处理的字节数。一般情况下,回调函数会处理接收到的报文头信息,可以打印、分析或保存这些信息。
以下是设置CURLOPT_HEADERFUNCTION参数的示例代码:
// 自定义的报文头回调函数
size_t header_callback(char buffer, size_t size, size_t nitems, void userdata) { size_t total_size = size * nitems;
// 处理报文头信息,比如打印或保存
printf("Received header data: %s\n", buffer); return total_size; }
// 设置CURLOPT_HEADERFUNCTION选项
curl_easy_setopt(curl, CURLOPT_HEADERFUNCTION, header_callback);
在上面的示例中,我们定义了一个名为header_callback的回调函数,它打印接收到的报文头信息,并返回实际处理的字节数。然后,通过curl_easy_setopt函数将该回调函数设置为CURLOPT_HEADERFUNCTION选项的值。
这样,当cURL执行HTTP请求并接收到响应时,每次接收到报文头数据时,都会调用我们自定义的回调函数进行处理。
综上,CURLOPT_HEADERFUNCTION参数允许用户自定义一个回调函数来处理接收到的报文头信息。该回调函数会在接收到报文头数据时被调用,可以在函数内部对报文头进行处理,比如打印、分析或保存报文头信息。
-
CURLOPT_HEADERDATA
(报文头回调函数的用户数据指针)
-
CURLOPT_HEADERDATA
是一个指针参数,用于设置传递给报文头回调函数的用户自定义数据。当使用cURL进行HTTP请求并设置了CURLOPT_HEADERFUNCTION参数指定了报文头回调函数时,可以通过设置CURLOPT_HEADERDATA参数来传递额外的用户数据给回调函数。
在设置CURLOPT_HEADERDATA参数时,可以传递任意类型的指针。该指针会作为参数之一传递给报文头回调函数,以供回调函数在处理报文头时使用。
以下是设置CURLOPT_HEADERDATA参数的示例代码:
// 自定义的报文头回调函数
size_t header_callback(char buffer, size_t size, size_t nitems, void userdata) {
// 从CURLOPT_HEADERDATA获取用户自定义数据
MyData data = (MyData )userdata;
// 处理报文头信息,可以使用传递的用户数据
printf("Received header data: %s\n", buffer);
return size * nitems;
// 用户自定义数据结构
typedef struct {
int value1;
double value2;
// 其他自定义字段 } MyData;
// 创建并设置用户自定义数据对象
MyData myData; myData.value1 = 10;
myData.value2 = 3.14;
// 设置CURLOPT_HEADERFUNCTION选项
curl_easy_setopt(curl, CURLOPT_HEADERFUNCTION, header_callback);
// 设置CURLOPT_HEADERDATA选项,传递用户自定义数据指针
curl_easy_setopt(curl, CURLOPT_HEADERDATA, &myData);
-
在上面的示例中,我们定义了一个名为header_callback的报文头回调函数,它通过CURLOPT_HEADERDATA参数接收用户自定义数据。在回调函数中,我们使用传递的用户数据来处理报文头信息。
首先,我们创建了一个自定义的数据结构MyData,并设置了一些字段的值。然后,通过curl_easy_setopt函数将header_callback函数设置为CURLOPT_HEADERFUNCTION选项的值,并将myData的指针传递给CURLOPT_HEADERDATA选项。
这样,在报文头回调函数被调用时,我们可以通过CURLOPT_HEADERDATA获取传递的用户自定义数据。回调函数在处理报文头时可以使用这些数据完成更复杂的操作。
综上:CURLOPT_HEADERDATA参数允许将用户自定义的数据指针传递给报文头回调函数。通过设置CURLOPT_HEADERDATA可以在回调函数中使用和访问这些用户数据,以完成更复杂的报文头处理操作。
6、curl_easy_perform
函数
curl_easy_perform()
是libcurl库中的一个函数,用于执行通过
curl_easy_setopt()
函数设置的CURL请求。
函数原型如下:
CURLcode curl_easy_perform(CURL *handle);
参数
-
handle
是一个CURL句柄,表示要执行的CURL请求。
返回值
函数返回一个CURLcode枚举类型的结果,用于指示请求执行的状态。如果返回
CURLE_OK
,表示请求执行成功;如果返回非零错误码,则表示发生了错误。
以下是一些主要的错误码说明:
-
CURLE_OK
: 请求成功完成。 -
CURLE_UNSUPPORTED_PROTOCOL
: 不支持的协议,由URL的头部指定。 -
CURLE_COULDNT_CONNECT
: 无法连接到远程主机或代理。 -
CURLE_REMOTE_ACCESS_DENIED
: 访问被拒绝。 -
CURLE_HTTP_RETURNED_ERROR
: HTTP返回错误。 -
CURLE_READ_ERROR
: 读取本地文件错误。
下面是一个示例代码:
#include <stdio.h>
#include <curl/curl.h>
int main() {
CURL *handle = curl_easy_init();
if (handle == NULL) {
fprintf(stderr, "Failed to initialize CURL handle\n");
return 1;
// Set URL and other options using curl_easy_setopt()
CURLcode res = curl_easy_perform(handle);
if (res != CURLE_OK) {
fprintf(stderr, "curl_easy_perform() failed: %s\n", curl_easy_strerror(res));
return 1;
curl_easy_cleanup(handle);
return 0;
}
在上述示例代码中,首先创建一个CURL句柄,并设置URL和其他选项。然后,调用
curl_easy_perform()
函数执行请求,并检查返回的结果码。如果返回的结果码不是
CURLE_OK
,则打印错误信息。
需要注意的是,在调用
curl_easy_perform()
之前,必须通过
curl_easy_setopt()
函数设置所需的选项,如URL、请求头、请求方法、请求体等。
curl_easy_setopt()
函数可以设置多个选项,以满足具体的请求需求。
7、curl_easy_getinfo
curl_easy_getinfo
是libcurl库中用于获取与传输相关的信息的函数。它接受一个CURL句柄、一个CURLINFO参数和其他可选参数,用于获取与传输操作相关的信息。
函数原型如下:
CURLcode curl_easy_getinfo(CURL *curl, CURLINFO info, ...);
参数说明: -
curl
:CURL句柄,用于获取信息的传输。
-
info
:CURLINFO参数,指定要获取的信息类型。CURLINFO
用于指定要获取的具体信息类型。下面是一些常用的CURLINFO
常量及其描述:
-
CURLINFO_EFFECTIVE_URL
: 获取请求的最终URL。该信息对应的参数类型是char*
。
-
CURLINFO_RESPONSE_CODE
: 获取服务器的HTTP响应代码。该信息对应的参数类型是long
。 -
CURLINFO_TOTAL_TIME
: 获取传输的总时间,包括DNS解析、连接、传输等时间。该信息对应的参数类型是double
。 -
CURLINFO_CONTENT_TYPE
: 获取服务器返回的内容类型。该信息对应的参数类型是char*
。 -
CURLINFO_CONTENT_LENGTH_DOWNLOAD
: 获取下载内容的总大小。该信息对应的参数类型是double
。 -
CURLINFO_SPEED_DOWNLOAD
: 获取下载速度。该信息对应的参数类型是double
。 -
CURLINFO_NAMELOOKUP_TIME
: 获取DNS解析时间。该信息对应的参数类型是double
。 -
CURLINFO_CONNECT_TIME
: 获取连接建立时间。该信息对应的参数类型是double
。 -
CURLINFO_PRETRANSFER_TIME
: 获取在传输开始之前的时间(即,发起请求到服务器响应之间的时间)。该信息对应的参数类型是double
。 -
CURLINFO_REDIRECT_TIME
: 获取重定向所花费的总时间。该信息对应的参数类型是double
。 -
CURLINFO_REDIRECT_COUNT
: 获取重定向的次数。该信息对应的参数类型是long
。 -
CURLINFO_HEADER_SIZE
: 获取接收到的报文头的大小。该信息对应的参数类型是long
。 -
CURLINFO_REQUEST_SIZE
: 获取发送的请求的大小。该信息对应的参数类型是long
。 -
CURLINFO_SSL_VERIFYRESULT
: 获取SSL认证结果。该信息对应的参数类型是long
。 -
CURLINFO_SPEED_UPLOAD
: 获取上传速度。该信息对应的参数类型是double
。 -
CURLINFO_CONTENT_LENGTH_UPLOAD
: 获取上传内容的总大小。该信息对应的参数类型是double
。 -
更多内容见:
https://
curl.se/libcurl/c/curl_
easy_getinfo.html
-
可以根据具体的需求选择适当的
CURLINFO
常量,并将合适的参数类型传递给curl_easy_getinfo
函数,以获取相应的信息。
以下是一个示例,演示如何使用
CURLINFO_EFFECTIVE_URL
和
CURLINFO_RESPONSE_CODE
获取请求的URL和服务器的响应代码:
// 创建CURL句柄
CURL *curl = curl_easy_init();
if(curl) {
// 设置URL和其他选项
curl_easy_setopt(curl, CURLOPT_URL, "http://www.example.com");
// 执行URL传输
CURLcode res = curl_easy_perform(curl);
// 检查传输结果
if(res != CURLE_OK) {
fprintf(stderr, "curl_easy_perform() failed: %s\n", curl_easy_strerror(res));
} else {
// 获取传输信息
char* effective_url;
long response_code;
res = curl_easy_getinfo(curl, CURLINFO_EFFECTIVE_URL, &effective_url);
if(res == CURLE_OK) {
printf("Effective URL: %s\n", effective_url);
} else {
fprintf(stderr, "curl_easy_getinfo() failed: %s\n", curl_easy_strerror(res));
res = curl_easy_getinfo(curl, CURLINFO_RESPONSE_CODE, &response_code);
if(res == CURLE_OK) {
printf("Response Code: %ld\n", response_code);
} else {
fprintf(stderr, "curl_easy_getinfo() failed: %s\n", curl_easy_strerror(res));
// 清理CURL句柄
curl_easy_cleanup(curl);
在上面的示例中,我们设置了URL并执行了URL传输。然后,使用
curl_easy_getinfo
函数分别获取了请求的最终URL和服务器的HTTP响应代码,并将结果存储在
effective_url
和
response_code
变量中。
请注意,当使用
curl_easy_getinfo
时,需要检查返回的错误代码,以确保获取信息的成功与否。
综上:
CURLINFO
常量用于指定要获取的具体信息类型,可以通过
curl_easy_getinfo
函数获取与传输操作相关的各种信息。根据
CURLINFO
常量的不同,对应的信息类型和参数传递方式也不同。根据具体需求选择合适的常量,并将对应的参数类型传递给
curl_easy_getinfo
函数,以获取相应的信息。
-
...
:其他可选参数,用于存储获取到的信息。
返回值:
- CURLcode:表示函数执行结果的枚举类型。如果返回值为CURLE_OK,则表示获取信息成功。其他返回值代表不同的错误或状态。
函数功能:
- curl_easy_getinfo函数可以获取与传输操作相关的各种信息,如传输状态、传输速度、文件大小等。
- 函数根据传入的CURLINFO参数指定要获取的具体信息类型,并将获取到的信息存储到提供的参数中。 - 获取到的信息的数据类型取决于CURLINFO参数的值和提供的参数的类型。
示例代码:
// 创建CURL句柄
CURL *curl = curl_easy_init();
if(curl) {
// 设置URL和其他选项
curl_easy_setopt(curl, CURLOPT_URL, "http://www.example.com");
// 执行URL传输
CURLcode res = curl_easy_perform(curl);
// 检查传输结果
if(res != CURLE_OK) {
fprintf(stderr, "curl_easy_perform() failed: %s\n", curl_easy_strerror(res));
} else {
// 获取传输信息
double total_time;
res = curl_easy_getinfo(curl, CURLINFO_TOTAL_TIME, &total_time);
if(res == CURLE_OK) {
printf("Transfer time: %.2f seconds\n", total_time);
} else {
fprintf(stderr, "curl_easy_getinfo() failed: %s\n", curl_easy_strerror(res));
// 清理CURL句柄
curl_easy_cleanup(curl);
在上面的示例中,我们首先创建了一个CURL句柄,并设置了URL和其他传输选项。然后使用curl_easy_perform函数执行URL传输。如果传输成功,我们使用curl_easy_getinfo函数获取传输的总时间信息,并将结果存储在total_time变量中。
通过检查curl_easy_getinfo函数的返回值,我们可以确定获取信息的成功与否,并根据情况输出获取到的信息或错误信息。最后通过curl_easy_cleanup清理CURL句柄。
总结:curl_easy_getinfo函数用于获取与传输操作相关的信息。函数根据传入的CURLINFO参数指定要获取的具体信息类型,并将获取到的信息存储到提供的参数中。函数的返回值表示获取信息的结果,CURLE_OK表示获取成功。
8、curl_version()
函数
curl_version()
是libcurl库中的一个函数,用于获取当前libcurl版本的字符串表示。
函数原型如下:
char *curl_version(void);
该函数不需要输入参数,它返回一个指向以空结尾的字符串的指针,表示当前libcurl的版本信息。
以下是一个示例代码:
#include <stdio.h>
#include <curl/curl.h>
int main() {
char *version = curl_version();
printf("libcurl version: %s\n", version);
return 0;
}
在上述示例代码中,调用
curl_version()
函数获取当前libcurl版本的字符串表示,并将其打印到控制台。
需要注意的是,返回的版本字符串是静态分配的,不需要手动释放内存。不应该尝试修改或释放该字符串,而应直接使用或打印它。
9、curl_getdate
curl_getdate
用于将日期字符串转换为
time_t
类型的时间值。
time_t curl_getdate(char *datestring, time_t *now);
该函数接受一个日期字符串作为输入,并尝试将其转换为对应的
time_t
时间值。函数还可以接受一个可选的
now
参数,用于提供当前时间的参考值。如果提供了
now
参数,则在转换日期字符串时会使用
now
参数作为参考时间。如果
now
参数为NULL,则使用当前系统时间作为参考。
示例用法:
#include <curl/curl.h>
#include <stdio.h>
int main() {
char datestring[] = "Sat, 01 Jan 2022 12:00:00 GMT";
time_t now = time(NULL);
time_t converted_time = curl_getdate(datestring, &now);
if (converted_time != -1) {
printf("Converted time: %s", ctime(&converted_time));
} else {
printf("Failed to convert the date string\n");
return 0;
在上面的示例中,我们定义了一个日期字符串,并提供一个当前时间作为参考。然后,使用
curl_getdate
函数将日期字符串转换为
time_t
类型的时间值,并将转换后的时间值打印出来。
请注意,如果日期字符串无法被正确解析为一个有效的时间值,
curl_getdate
函数将返回-1。
综上:
curl_getdate
是libcurl库中的函数,用于将日期字符串转换为
time_t
类型的时间值。它接受一个日期字符串作为输入,并尝试将其转换为对应的
time_t
时间值。可以选择提供一个当前时间的参考值,以便在转换日期字符串时使用。转换成功时,函数返回转换后的时间值;如果转换失败,函数返回-1。
10、curl_mime_init
curl_mime
是libcurl用于处理MIME数据的结构。MIME(Multipurpose Internet Mail Extensions)是一种用于标识在网络上发送的多媒体和其他非ASCII数据的标准。
curl_mime *curl_mime_init(CURL *easy_handle);
参数:
-
easy
:一个已经初始化的CURL
句柄,用于进行MIME数据处理。
返回值:
-
curl_mime
结构的指针:如果初始化成功,函数将返回一个指向初始化的curl_mime
结构的指针。可以使用该指针进行MIME数据的处理。如果初始化失败,函数将返回NULL
。
注意事项:
-
在调用
curl_mime_init
函数之前,应首先使用curl_easy_init
函数初始化一个CURL
句柄,然后将该句柄作为参数传递给curl_mime_init
函数。 -
在使用完
curl_mime
结构后,应使用curl_mime_free
函数释放该结构,以避免内存泄漏。 -
当不再需要使用
CURL
句柄时,应使用curl_easy_cleanup
函数将其清理
示例用法:
#include <curl/curl.h>
#include <stdio.h>
int main() {
CURL *curl = curl_easy_init();
if (!curl) {
fprintf(stderr, "Failed to initialize libcurl\n");
return 1;
curl_mime *mime = curl_mime_init(curl);
if (!mime) {
fprintf(stderr, "Failed to initialize CURL MIME structure\n");
curl_easy_cleanup(curl);
return 1;
// 使用mime结构进行MIME数据的处理
curl_mime_free(mime);
curl_easy_cleanup(curl);
return 0;
在上面的示例中,我们首先使用
curl_easy_init
函数初始化了CURL句柄,然后使用
curl_mime_init
函数初始化了
curl_mime
结构。如果初始化成功,则可以使用
mime
结构进行MIME数据的处理。在处理完MIME数据后,我们使用
curl_mime_free
函数释放了
mime
结构。最后,使用
curl_easy_cleanup
函数清理CURL句柄。
总结:
curl_mime_init
是libcurl库中用于初始化
curl_mime
结构的函数。它接受一个CURL句柄作为参数,并返回一个指向初始化的
curl_mime
结构的指针。可以使用返回的结构指针进行MIME数据的处理。记得在使用完毕后,使用
curl_mime_free
函数释放
curl_mime
结构,并使用
curl_easy_cleanup
函数清理CURL句柄。
11、curl_formadd
该函数已被弃用。 请改用 curl_mime_init 。
12、curl_slist_append
curl_slist_append
用于向
curl_slist
结构中添加新的字符串元素。
函数原型如下:
struct curl_slist *curl_slist_append(struct curl_slist *list,
const char *string);
参数: -
list
:一个指向
curl_slist
结构的指针,表示一个字符串列表。初始时,该指针可以为
NULL
,随着调用
curl_slist_append
添加字符串元素,会返回一个指向更新后字符串列表的指针。 -
string
:要添加到字符串列表的字符串。
返回:
返回值是一个指向更新后字符串列表的指针。如果添加成功,返回的指针将指向新的字符串列表。如果添加失败,返回的指针将与
list
参数相同。
curl_slist
结构是一个链表,它用于存储字符串元素。使用
curl_slist_append
函数可以将新的字符串元素添加到链表的末尾,并返回更新后链表的指针。
curl_slist
是libcurl库中用于存储字符串列表的数据结构。它被定义为一个结构体:
struct curl_slist {
char *data; // 字符串数据
struct curl_slist *next; // 指向下一个元素的指针
};
curl_slist
结构体由两个字段组成: -
data
:指向字符串数据的指针,存储列表中的每个字符串。 -
next
:指向下一个列表元素的指针,用于构成链表。
使用
curl_slist
结构体可以创建一个简单的字符串链表,每个链表节点存储一个字符串。常见用途是在libcurl中设置HTTP请求头或POST数据。函数
curl_slist_append
可以方便地向
curl_slist
结构中添加新的字符串节点。
以下是一个示例,演示如何使用
curl_slist
结构和相关函数
curl_slist_append
和
curl_slist_free_all
创建和释放字符串链表:
#include <stdio.h>
#include <curl/curl.h>
int main() {
struct curl_slist *list = NULL;
// 添加字符串元素到链表
list = curl_slist_append(list, "Accept: application/json");
list = curl_slist_append(list, "Content-Type: application/json");
// 遍历链表并打印每个字符串
struct curl_slist *item = list;
while (item != NULL) {
printf("%s\n", item->data);
item = item->next;
// 释放链表内存
curl_slist_free_all(list); // 释放整个链表
return 0;
}
在上面的示例中,我们使用
curl_slist_append
函数将两个字符串元素添加到链表中,然后遍历链表并打印每个字符串。最后,我们使用
curl_slist_free_all
函数释放链表内存。
通过使用
curl_slist
结构,我们可以方便地构建和管理字符串列表,以满足libcurl库中对于字符串链表的需求。
请注意,使用完
curl_slist
结构后,应该使用
curl_slist_free_all
函数释放链表内存,以避免内存泄漏。
13、curl_slist_free_all
curl_slist_free_all
用于释放使用
curl_slist
结构创建的字符串链表的内存。
函数原型如下:
void curl_slist_free_all(struct curl_slist *list);
参数: -
list
:一个指向
curl_slist
结构的指针,表示要释放的字符串链表。
该函数用于释放整个字符串链表及其节点所占用的内存。它会遍历整个链表,并释放每个元素的
data
字段指向的字符串内存,然后释放每个链表节点的内存。
14、curl_easy_escape
curl_easy_escape
用于对给定的字符串进行URL编码。
函数原型如下:
char *curl_easy_escape(CURL *curl, const char *string, int length);
参数解释: -
curl
:一个指向
CURL
类型的指针,用于指定与URL编码相关的配置选项。通常情况下,可以传递
NULL
,它将使用默认配置。 -
string
:要进行URL编码的字符串。 -
length
:字符串的长度(不包括结尾的空字符)。如果设置为
-1
,则函数将自动计算字符串长度。
返回值是一个指向URL编码字符串的指针,这个字符串是通过对输入字符串进行编码而得到的。如果发生错误或内存分配失败,返回值将为
NULL
。
示例用法:
#include <stdio.h>
#include <curl/curl.h>
int main() {
CURL *curl = curl_easy_init();
const char *string = "Hello, World!";
char *encoded_string = curl_easy_escape(curl, string, -1);
if (encoded_string) {
printf("Encoded string: %s\n", encoded_string);
curl_free(encoded_string); // 释放URL编码字符串的内存
curl_easy_cleanup(curl);
return 0;
}
在上面的示例中,我们首先使用
curl_easy_init
函数初始化
CURL
类型的指针,然后定义一个字符串
string
。接下来,我们调用
curl_easy_escape
函数对字符串进行URL编码,并将结果存储在
encoded_string
中。然后,我们使用
printf
打印编码后的字符串,并最后通过调用
curl_free
释放
encoded_string
的内存。最后,我们使用
curl_easy_cleanup
函数清理CURL句柄。
注意:当使用完
encoded_string
后,需要通过
curl_free
函数手动释放
encoded_string
的内存,以避免内存泄漏。
15、curl_easy_unescape
curl_easy_unescape
是libcurl库中的一个函数,用于对经过URL编码的字符串进行解码。
函数原型如下:
char *curl_easy_unescape(CURL *curl, const char *input,
int inlength, int *outlength);
参数解释: -
curl
:一个指向
CURL
类型的指针,用于指定与URL解码相关的配置选项。通常情况下,可以传递
NULL
,它将使用默认配置。 -
input
:需要进行URL解码的字符串。 -
inlength
:
input
字符串的长度(不包括结尾的空字符)。如果设置为
-1
,则函数将自动计算字符串长度。 -
outlength
:一个指向整数的指针,用于存储解码后字符串的长度。解码后字符串的长度将通过这个指针返回给调用者。
返回值是一个指向解码后字符串的指针。解码后的字符串会通过动态分配内存来存储,并且必须在不需要的时候进行释放。如果发生错误或内存分配失败,返回值将为
NULL
。
示例用法:
#include <stdio.h>
#include <curl/curl.h>
int main() {
CURL *curl = curl_easy_init();
const char *input = "Hello%2C%20World%21";
int outlength;
char *decoded_string = curl_easy_unescape(curl, input, -1, &outlength);
if (decoded_string) {
printf("Decoded string: %s\n", decoded_string);
printf("Decoded string length: %d\n", outlength);
curl_free(decoded_string); // 释放解码后字符串的内存