[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
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值