[C++] 使用libcurl执行http get请求(转)

内容提要

1. 安装libcurl库
2. 使用libcurl需要的编译参数
3. get请求
4. 参考链接

一、 安装libcurl库

download address:  https://curl.haxx.se/download/
或者 wget https://curl.haxx.se/download/curl-7.64.1.tar.gz

    1
    2

到下载目录, 解压, 进入curl文件夹 执行以下命令
./configure
make
sudo make install

    1
    2
    3
    4

二、 使用libcurl时需要的编译参数

例如当前文件为main.cpp
编译: g++ main.cpp -lcurl

    1
    2

三、 get请求
函数原型

/***
 *  buffer         接收数据所在的缓冲区
 *     size        要读取的字节数
 *  count        读写size长度的数据count次
 *  user_ptr    用户自定义文件指针
 */
size_t getUrlResponse(void *buffer, size_t size, size_t count, void *user_ptr); // 在这里用作回调函数
/***
 *  url     请求网址
 */
std::string get(const std::string& url); // 传入url执行get请求

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11

参数介绍

easy interface函数, 有同样的名称前缀curl_easy.
要使用easy interface函数, 首先需要一个easy handle, 用于参数处理.
如何声明一个easy handle?
    CRUL *handle;
可以在easy handle上设置属性和操作, 不可以多个线程共享一个easy handle

使用 curl_easy_setopt(handle, opt, param) 函数
设置easy handle属性与操作, 这些属性与操作控制如何与远程主机通信

常用opt属性设置:
    CURLOPT_URL    设置url
    CURLOPT_WRITEFUNCTION 注册回调函数
    CURLOPT_WRITEDATA 数据存储指针
    
如果想保存请求后从远程主机返回的数据, 需要注册回调函数, 回调函数的原型为上方的getUrlResponse函数, 此函数会在接收到数据时调用
使用curl_easy_setopt(handle, CURLOPT_WRITEFUNCTION, &getUrlResponse)
使用注册回调函数, 只是提供一个自定义参数buffer, libcurl不对返回的数据进行处理, 只能简单的传递, 哪怎么能获取到数据呢?
使用curl_easy_setopt(handle, CURLOPT_WRITEDATA, &user_ptr) 修改回调函数参数, 然后设置数据存储指针, 请求后的数据就会存到user_ptr中, user_ptr也可以是文件指针. (例如后文-实现get请求)
使用curl_easy_perform(handle) 执行get请求

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19

实现get请求

#include <iostream>
#include <curl/curl.h>
using namespace std;
/* 不考虑任何异常的情况, 简单的get请求 */
/***
 *  buffer         接收数据所在的缓冲区
 *     size        要读取的字节数
 *  count        读写size长度的数据count次
 *  response    用户自定义文件指针
 */
size_t getUrlResponse(char* buffer, size_t size, size_t count, string* response) {
    size_t recv_size = size * count;
    response->clear();
    response->append(buffer);
    return recv_size;
}

string get(const string& url) {
    // 请求数据
    string response;
    // easy handle声明
    CURL *handle;
    // 初始化handle
    handle = curl_easy_init();
    // 设置url
    curl_easy_setopt(handle, CURLOPT_URL, url.c_str());
    // 注册回调函数
    curl_easy_setopt(handle, CURLOPT_WRITEFUNCTION, &getUrlResponse);
    /* 可以注释 set CURLOPT_WRITEDATA, 同时将回调函数恢复为上文中的原型, 看看会发生什么 */
    // 获取信息
    curl_easy_setopt(handle, CURLOPT_WRITEDATA, &response);
    // 执行请求
    curl_easy_perform(handle);
    // 释放
    curl_easy_cleanup(handle);
    
    return response;
}
int main() {
    // 使用前初始化libcurl, 只需初始化一次
    curl_global_init(CURL_GLOBAL_DEFAULT);
    // 执行请求
    cout << get("www.baidu.com");
    // 释放libcurl相关资源
    curl_global_cleanup();
    return 0;
}

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47

四、 参考链接
关于libcurl更多用法, 在下方参考链接

    https://www.cnblogs.com/jikexianfeng/p/6055024.html
————————————————
版权声明:本文为CSDN博主「「已注销」」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/WwxjLiu/article/details/89979778

posted on 2022-03-11 10:11  混元真人  阅读(934)  评论(0)    收藏  举报