热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

qtformacos使用libcurl请求https协议

libcurl是一个非常实用的网络库,数据上传下传,登录等经常用,在Win开发的过程中使用的比较多,所以资源也比较多

libcurl是一个非常实用的网络库,数据上传下传,登录等经常用,在Win开发的过程中使用的比较多,所以资源也比较多,在Mac上开发的比较少,而官网自带的库通常是不支持https的,本篇记录https的使用,首先使用

Macos libcurl静态库编译支持https_班公湖里洗过脚的博客-CSDN博客

这里编译好的支持https的libcurl静态库,Mac上由于签名的原因,一般使用静态库。

配置头文件目录和库依赖写在.pro文件中。

QT += core guigreaterThan(QT_MAJOR_VERSION, 4): QT += widgetsCONFIG += c++14DESTDIR = ../bin# The following define makes your compiler emit warnings if you use
# any Qt feature that has been marked deprecated (the exact warnings
# depend on your compiler). Please consult the documentation of the
# deprecated API in order to know how to port your code away from it.
DEFINES += QT_DEPRECATED_WARNINGS# You can also make your code fail to compile if it uses deprecated APIs.
# In order to do so, uncomment the following line.
# You can also select to disable deprecated APIs only up to a certain version of Qt.
#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000 # disables all the APIs deprecated before Qt 6.0.0SOURCES += \curlhttpsclient.cpp \main.cpp \mainwindow.cppHEADERS += \curlhttpsclient.h \mainwindow.hFORMS += \mainwindow.uimacos:{INCLUDEPATH += $$PWD/curlINCLUDEPATH += $$PWD/opensslLIBS += -L$$PWD/libs -lssl -lcrypto -lcurlmessage("pwd=" + $$PWD)
}
# Default rules for deployment.
qnx: target.path = /tmp/$${TARGET}/bin
else: unix:!android: target.path = /opt/$${TARGET}/bin
!isEmpty(target.path): INSTALLS += target

源码如下:

#ifndef CURLHTTPSCLIENT_H
#define CURLHTTPSCLIENT_H#include
#include using namespace std;class CurlHttpsClient
{
public:static CurlHttpsClient* getInstance(){static CurlHttpsClient httpsClient;return &httpsClient;}public:CURLcode httpsGetRequest(const string& url, string& resp, int nTimeOut);CURLcode httpsPostRequest(const string& url, const string& postData, string& resp, int nTimeOut);private:CurlHttpsClient();~CurlHttpsClient();
};#endif // CURLHTTPSCLIENT_H

#include "curlhttpsclient.h"
#include static size_t writeCallback(void *buffer, size_t size, size_t nmemb, void* data) {std::string* s = (std::string*)data;s->append((char*)buffer, size * nmemb);return size * nmemb;
}CurlHttpsClient::CurlHttpsClient()
{curl_global_init(CURL_GLOBAL_DEFAULT);
}CurlHttpsClient::~CurlHttpsClient()
{}CURLcode CurlHttpsClient::httpsGetRequest(const string &url, string &resp, int nTimeOut)
{CURLcode res;void* handle = curl_easy_init();if (handle == NULL) {return CURLE_FAILED_INIT;}struct curl_slist* headers = NULL;headers = curl_slist_append(headers, "Connection: Keep-Alive");headers = curl_slist_append(headers,"content-type:application/json");curl_easy_setopt(handle, CURLOPT_ENCODING , "gzip");curl_easy_setopt(handle, CURLOPT_HTTPHEADER, headers);curl_easy_setopt(handle, CURLOPT_URL, url.c_str());curl_easy_setopt(handle, CURLOPT_NOSIGNAL, 1L);curl_easy_setopt(handle, CURLOPT_TIMEOUT, nTimeOut);curl_easy_setopt(handle, CURLOPT_SSL_VERIFYPEER, false);curl_easy_setopt(handle, CURLOPT_SSL_VERIFYHOST, false);curl_easy_setopt(handle, CURLOPT_NOPROGRESS, 1L);curl_easy_setopt(handle, CURLOPT_WRITEFUNCTION, writeCallback);curl_easy_setopt(handle, CURLOPT_WRITEDATA, (void*)&resp);res = curl_easy_perform(handle);curl_easy_cleanup(handle);return res;
}CURLcode CurlHttpsClient::httpsPostRequest(const string& url, const string& postData, string& resp, int nTimeOut)
{CURLcode res;void* handle = curl_easy_init();struct curl_slist* headers = NULL;if (handle == NULL) {return CURLE_FAILED_INIT;}curl_easy_setopt(handle, CURLOPT_URL, url.c_str());headers = curl_slist_append(headers,"content-type:application/json;charset=UTF-8;");headers = curl_slist_append(headers,"Expect:");curl_easy_setopt(handle, CURLOPT_HTTPHEADER, headers);curl_easy_setopt(handle, CURLOPT_NOSIGNAL, 1L);curl_easy_setopt(handle, CURLOPT_SSL_VERIFYPEER, 0L);curl_easy_setopt(handle, CURLOPT_SSL_VERIFYHOST, 0L);curl_easy_setopt(handle, CURLOPT_POSTFIELDS, postData.c_str());curl_easy_setopt(handle, CURLOPT_POSTFIELDSIZE, postData.size());curl_easy_setopt(handle, CURLOPT_CONNECTTIMEOUT, nTimeOut);curl_easy_setopt(handle, CURLOPT_TIMEOUT, nTimeOut);curl_easy_setopt(handle, CURLOPT_FOLLOWLOCATION, 1); //支持服务器跳转curl_easy_setopt(handle, CURLOPT_TCP_KEEPALIVE, 1L); // enable TCP keep-alive for this transfercurl_easy_setopt(handle, CURLOPT_TCP_KEEPIDLE, 120L); // keep-alive idle time to 120 secondscurl_easy_setopt(handle, CURLOPT_WRITEFUNCTION, writeCallback);curl_easy_setopt(handle, CURLOPT_WRITEDATA, (void*)&resp);curl_easy_setopt(handle, CURLOPT_POST, 1L);res = curl_easy_perform(handle);curl_slist_free_all(headers);curl_easy_cleanup(handle);return res;
}

#ifndef MAINWINDOW_H
#define MAINWINDOW_H#include QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACEclass MainWindow : public QMainWindow
{Q_OBJECTpublic:MainWindow(QWidget *parent = nullptr);~MainWindow();private:void initConnect();private slots:void slotHttpGet();void slotHttpPost();private:Ui::MainWindow *ui;
};
#endif // MAINWINDOW_H

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include
#include "curlhttpsclient.h"
#include using std::string;MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)
{ui->setupUi(this);initConnect();
}MainWindow::~MainWindow()
{delete ui;
}void MainWindow::initConnect()
{connect(ui->pushButton_get, SIGNAL(clicked()), this, SLOT(slotHttpGet()));connect(ui->pushButton_post, SIGNAL(clicked()), this, SLOT(slotHttpPost()));CurlHttpsClient::getInstance();
}void MainWindow::slotHttpGet()
{qDebug() <<"MainWindow::slotHttpGet&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;";//string strUrl &#61; "https://www.csdn.net";string strUrl &#61; "https://curl.se/download/";string strRes;CurlHttpsClient::getInstance()->httpsGetRequest(strUrl, strRes, 6);qDebug() <<"MainWindow::slotHttpGet&#61;&#61;&#61;&#61;&#61;&#61;&#61;strRes&#61;&#61;&#61;&#61;&#61;&#61;" <}void MainWindow::slotHttpPost()
{qDebug() <<"MainWindow::slotHttpPost&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;";
}

编译&#xff1a;

 添加

LIBS &#43;&#61; -L$$PWD/libs -lssl -lcrypto -lcurl
LIBS &#43;&#61; -lz

运行&#xff0c;请求get

 上面是https://curl.se/download/网站的内容。




推荐阅读
  • C++字符字符串处理及字符集编码方案
    本文介绍了C++中字符字符串处理的问题,并详细解释了字符集编码方案,包括UNICODE、Windows apps采用的UTF-16编码、ASCII、SBCS和DBCS编码方案。同时说明了ANSI C标准和Windows中的字符/字符串数据类型实现。文章还提到了在编译时需要定义UNICODE宏以支持unicode编码,否则将使用windows code page编译。最后,给出了相关的头文件和数据类型定义。 ... [详细]
  • Android Studio Bumblebee | 2021.1.1(大黄蜂版本使用介绍)
    本文介绍了Android Studio Bumblebee | 2021.1.1(大黄蜂版本)的使用方法和相关知识,包括Gradle的介绍、设备管理器的配置、无线调试、新版本问题等内容。同时还提供了更新版本的下载地址和启动页面截图。 ... [详细]
  • 本文介绍了利用ARMA模型对平稳非白噪声序列进行建模的步骤及代码实现。首先对观察值序列进行样本自相关系数和样本偏自相关系数的计算,然后根据这些系数的性质选择适当的ARMA模型进行拟合,并估计模型中的位置参数。接着进行模型的有效性检验,如果不通过则重新选择模型再拟合,如果通过则进行模型优化。最后利用拟合模型预测序列的未来走势。文章还介绍了绘制时序图、平稳性检验、白噪声检验、确定ARMA阶数和预测未来走势的代码实现。 ... [详细]
  • GetWindowLong函数
    今天在看一个代码里头写了GetWindowLong(hwnd,0),我当时就有点费解,靠,上网搜索函数原型说明,死活找不到第 ... [详细]
  • Commit1ced2a7433ea8937a1b260ea65d708f32ca7c95eintroduceda+Clonetraitboundtom ... [详细]
  • baresip android编译、运行教程1语音通话
    本文介绍了如何在安卓平台上编译和运行baresip android,包括下载相关的sdk和ndk,修改ndk路径和输出目录,以及创建一个c++的安卓工程并将目录考到cpp下。详细步骤可参考给出的链接和文档。 ... [详细]
  • 本文介绍了Hyperledger Fabric外部链码构建与运行的相关知识,包括在Hyperledger Fabric 2.0版本之前链码构建和运行的困难性,外部构建模式的实现原理以及外部构建和运行API的使用方法。通过本文的介绍,读者可以了解到如何利用外部构建和运行的方式来实现链码的构建和运行,并且不再受限于特定的语言和部署环境。 ... [详细]
  • XML介绍与使用的概述及标签规则
    本文介绍了XML的基本概念和用途,包括XML的可扩展性和标签的自定义特性。同时还详细解释了XML标签的规则,包括标签的尖括号和合法标识符的组成,标签必须成对出现的原则以及特殊标签的使用方法。通过本文的阅读,读者可以对XML的基本知识有一个全面的了解。 ... [详细]
  • 计算机存储系统的层次结构及其优势
    本文介绍了计算机存储系统的层次结构,包括高速缓存、主存储器和辅助存储器三个层次。通过分层存储数据可以提高程序的执行效率。计算机存储系统的层次结构将各种不同存储容量、存取速度和价格的存储器有机组合成整体,形成可寻址存储空间比主存储器空间大得多的存储整体。由于辅助存储器容量大、价格低,使得整体存储系统的平均价格降低。同时,高速缓存的存取速度可以和CPU的工作速度相匹配,进一步提高程序执行效率。 ... [详细]
  • 本文详细介绍了Spring的JdbcTemplate的使用方法,包括执行存储过程、存储函数的call()方法,执行任何SQL语句的execute()方法,单个更新和批量更新的update()和batchUpdate()方法,以及单查和列表查询的query()和queryForXXX()方法。提供了经过测试的API供使用。 ... [详细]
  • 本文讨论了在数据库打开和关闭状态下,重新命名或移动数据文件和日志文件的情况。针对性能和维护原因,需要将数据库文件移动到不同的磁盘上或重新分配到新的磁盘上的情况,以及在操作系统级别移动或重命名数据文件但未在数据库层进行重命名导致报错的情况。通过三个方面进行讨论。 ... [详细]
  • 本文介绍了Android 7的学习笔记总结,包括最新的移动架构视频、大厂安卓面试真题和项目实战源码讲义。同时还分享了开源的完整内容,并提醒读者在使用FileProvider适配时要注意不同模块的AndroidManfiest.xml中配置的xml文件名必须不同,否则会出现问题。 ... [详细]
  • MyBatis多表查询与动态SQL使用
    本文介绍了MyBatis多表查询与动态SQL的使用方法,包括一对一查询和一对多查询。同时还介绍了动态SQL的使用,包括if标签、trim标签、where标签、set标签和foreach标签的用法。文章还提供了相关的配置信息和示例代码。 ... [详细]
  • Whatsthedifferencebetweento_aandto_ary?to_a和to_ary有什么区别? ... [详细]
  • 解决文件名过长下载失败问题的jQuery方案
    本文介绍了使用jQuery解决文件名过长导致下载失败的问题。原方案中存在文件名部分丢失的问题,通过动态生成隐藏域表单并提交的方式来解决。详细的解决方案和代码示例在文章中给出。 ... [详细]
author-avatar
Zh_jodie_776
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有