c++使用libcurl库 调用get请求

我的梦境 提交于 2020-02-21 04:22:20

内容提要

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
标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!