curl异步请求相比于同步请求差别不大,配合业务使用时会复杂点;
注意点:
1、使用CURLM模式时,curl_easy_init返回的CURL会复用,一旦请求频率过高会导致返回数据错乱;
2、可在请求之前添加域名解析,加速接口的请求速度,效果非常明显;
3、本示例删除了curl_easy_setopt(curl, CURLOPT_TIMEOUT, TIME_OUT) 超时设置是为了配合业务需要,可自行添加;
4、示例使用了Qt的类型和信号槽
1:创建一个业务线程:轮询curl是否有可用数据
#ifndef CURL_THREAD_H
#define CURL_THREAD_H
#include <QThread>
class CurlServer;
class CurlThread : public QThread
{
Q_OBJECT
signals :
//str:返回回调数据的地址
void signal_CurlThread_SendData(void* str);
public:
CurlThread(QObject *parent);
~CurlThread();
void stop();
void setToken(const std::string token);
/*intptr_t:返回回调数据的地址,在业务侧保存该数据对应的请求类型
* 用来匹配接口返回的数据类型
*/
intptr_t gets (std::string& strUrl);
intptr_t posts(std::string& strUrl, std::string& strPara);
protected:
virtual void run();
private:
CurlServer * m_pCurlServer = nullptr;
bool m_bIsStop = false;
};
#endif // CURL_THREAD_H
#include "curl_thread.h"
#include "./curl_server.h"
#pragma execution_character_set("utf-8")
CurlThread::CurlThread(QObject *parent)
: QThread(parent)
{
m_pCurlServer = new CurlServer(this);
//ToDo:连接信号
connect(m_pCurlServer, &CurlServer::signal_CurlServer_SendData, this, &CurlThread::signal_CurlThread_SendData);
}
CurlThread::~CurlThread()
{
m_bIsStop = true;
}
void CurlThread::stop()
{
m_bIsStop = true;
}
void CurlThread::setToken(const std::string token)
{
m_pCurlServer->setToken(token);
}
intptr_