[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
到下载目录, 解压, 进入curl文件夹 执行以下命令
./configure
make
sudo make install

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

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

三、 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请求

参数介绍

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请求

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

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

  1. https://www.cnblogs.com/jikexianfeng/p/6055024.html
  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
C++使用libcurl库可以方便地进行网络通信,包括发送HTTP请求、下载文件等操作。下面是使用libcurl的一般步骤: 1. 引入头文件:在代码中引入libcurl的头文件,通常是`#include <curl/curl.h>`。 2. 初始化和清理:在使用libcurl之前,需要调用`curl_global_init()`函数进行初始化,并在使用完毕后调用`curl_global_cleanup()`函数进行清理。 3. 创建和配置CURL对象:使用`curl_easy_init()`函数创建一个CURL对象,并使用`curl_easy_setopt()`函数设置相关选项,如设置请求的URL、设置请求的方法、设置请求头等。 4. 执行请求:使用`curl_easy_perform()`函数执行请求,该函数会阻塞直到请求完成。 5. 处理响应:可以通过设置回调函数来处理响应数据,如保存到文件、打印到控制台等。 6. 清理资源:使用`curl_easy_cleanup()`函数释放CURL对象。 下面是一个简单的示例代码,演示了如何使用libcurl发送GET请求并将响应打印到控制台: ```cpp #include <iostream> #include <curl/curl.h> // 回调函数,处理响应数据 size_t WriteCallback(void* contents, size_t size, size_t nmemb, std::string* response) { size_t totalSize = size * nmemb; response->append((char*)contents, totalSize); return totalSize; } int main() { CURL* curl; CURLcode res; std::string response; // 初始化 curl_global_init(CURL_GLOBAL_DEFAULT); // 创建CURL对象 curl = curl_easy_init(); if (curl) { // 设置请求的URL curl_easy_setopt(curl, CURLOPT_URL, "http://example.com"); // 设置回调函数 curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, WriteCallback); curl_easy_setopt(curl, CURLOPT_WRITEDATA, &response); // 执行请求 res = curl_easy_perform(curl); if (res != CURLE_OK) { std::cerr << "curl_easy_perform() failed: " << curl_easy_strerror(res) << std::endl; } // 打印响应数据 std::cout << response << std::endl; // 清理资源 curl_easy_cleanup(curl); } // 清理 curl_global_cleanup(); return 0; } ``` 这只是一个简单的示例,libcurl还提供了更多的功能和选项,可以根据具体需求进行配置和使用
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值