QT http请求数据

1.创建一个请求类(HttpWork):

HttpWork.h头文件

#pragma once

#include <QObject>
#include <QNetworkAccessManager>
#include <QNetworkReply>
#include "NetWorkCookie.h"
#include <QNetworkCookie>

class HttpWork : public QObject
{
    Q_OBJECT

public:
    HttpWork(QObject *parent,bool ssl=false,bool autoDelete = true);
    ~HttpWork();
    void get(QString url,QString token="");
    void post(QString url, QByteArray param, QString token = "");
private:
    QNetworkAccessManager *m_pNetworkAccessManager;
    NetworkCookie* m_pCookie;
    bool m_bEnabelSSl;
    bool m_bAutoDelete;
private slots:
    void replyFinished(QNetworkReply *reply);
signals:
    void sglResponse(QString err, QString data);

};

HttpWork.cpp源文件

#include "HttpWork.h"
#include <QNetworkRequest>

HttpWork::HttpWork(QObject *parent, bool ssl , bool autoDelete)
    : QObject(parent)
    , m_bEnabelSSl(ssl)
    , m_bAutoDelete(autoDelete)
{
    m_pNetworkAccessManager = new QNetworkAccessManager(this);
    m_pCookie = new NetworkCookie(this);
    connect(m_pNetworkAccessManager, SIGNAL(finished(QNetworkReply*)), this, SLOT(replyFinished(QNetworkReply*)));
}

HttpWork::~HttpWork()
{

}

void HttpWork::get(QString url,QString token)
{
    QNetworkRequest request(url);
    if (!token.isEmpty()) {
        request.setRawHeader("authorization", token.toStdString().c_str());;
    }

    request.setRawHeader("Content-Type", "application/json");
    m_pNetworkAccessManager->get(request);
}

void HttpWork::post(QString url, QByteArray param, QString token)
{
    QNetworkRequest request(url);
    if (!token.isEmpty()) {
        request.setRawHeader("authorization", token.toStdString().c_str());;
    }
    if (m_bEnabelSSl) {
        QSslConfiguration sslConfig = QSslConfiguration::defaultConfiguration();
        sslConfig.setPeerVerifyMode(QSslSocket::VerifyNone);
        sslConfig.setProtocol(QSsl::TlsV1_2);
        request.setSslConfiguration(sslConfig);
    }
    //设置cookie到浏览器

    m_pNetworkAccessManager->setCookieJar(m_pCookie);
    request.setRawHeader("Content-Type", "application/json");
    request.setRawHeader("Content-Type", "application/x-www-form-urlencoded");
    m_pNetworkAccessManager->post(request, param);
}

void HttpWork::replyFinished(QNetworkReply *reply)
{
    int code = -1;
    QVariant variant = reply->attribute(QNetworkRequest::HttpStatusCodeAttribute);
    if (variant.isValid()){
        code =  variant.toInt();
    }

    QString err;
    QByteArray bytes;
    if(reply->error() == QNetworkReply::NoError) {
        QList<QNetworkCookie> cookies = m_pCookie->getCookies();
        for (int i = 0; i < cookies.length(); i++) {
            QNetworkCookie cookie = cookies.at(i);
            QString name = cookie.name();
            QString value  = cookie.value();
        }
        bytes = reply->readAll();

    }
    else {
        err = reply->errorString()+"statusCode:"+code;
    }
    emit sglResponse(err, QString(bytes));
    if (m_bAutoDelete) {
        deleteLater();
    }

}

NetworkCookie.h头文件

#pragma once

#include <QNetworkCookieJar>
#include <QNetworkCookie>
class NetworkCookie : public QNetworkCookieJar
{
    Q_OBJECT

public:
    NetworkCookie(QObject *parent);
    ~NetworkCookie();
    QList<QNetworkCookie> getCookies();
    void setCookies(const QList<QNetworkCookie>& cookieList);
};

NetworkCookie.cpp源文件

#include "NetworkCookie.h"

NetworkCookie::NetworkCookie(QObject *parent)
    : QNetworkCookieJar(parent)
{
}

NetworkCookie::~NetworkCookie()
{
}

QList<QNetworkCookie> NetworkCookie::getCookies()
{
    return QNetworkCookieJar::allCookies();
}

void NetworkCookie::setCookies(const QList<QNetworkCookie>& cookieList)
{
    this->setAllCookies(cookieList);

}

需要http请求数据的时候调用:

void ServerAPI::login(QString address, int port, QString user, QString passwd)
{
    m_sAddress = address;
    m_nPort = port;
    m_sUser = user;
    m_sHost = QString("http%1://%2:%3").arg(m_nPort == 443 ? "s" : "").arg(address).arg(port);

    HttpWork* worker;

    worker = new HttpWork(this, m_nPort == 443);

    connect(worker, SIGNAL(sglResponse(QString, QString)), this, SLOT(sltOnReponseLogin(QString, QString)));
    QByteArray append = QString("type=1&account_or_mobile=%1&pwd_or_checkCode=%2").arg(user).arg(passwd).toUtf8();
    worker->post(m_sHost + "/admin-api/v1/user-manage/login", append);

}
void ServerAPI::sltOnReponseLogin(QString err, QString data)
{
    QString sErr = "";

    if (err.isEmpty()) {
        cJSON* jsData = cJSON_Parse(data.toStdString().c_str());
        if (jsData) {
            cJSON* pCode = cJSON_GetObjectItem(jsData, "code");
            cJSON* pData = cJSON_GetObjectItem(jsData, "data");
            if (pCode->valueint == 200)
            {
                m_sToken = cJSON_GetObjectItem(pData, "token")->valuestring;
            }
            else {
                cJSON* pError = cJSON_GetObjectItem(jsData, "error");
                sErr = pError->valuestring;
            }
        }
        cJSON_Delete(jsData);
    }
    else {
        sErr = err;
    }
    emit sglLoginResult(sErr.isEmpty() , sErr);
    if (sErr.isEmpty())
    {
        QTimer::singleShot(3000, this, SLOT(sltLoopTimeout()));   //这是一次性定时器到了定时间隔之后只发送一次信号槽函数只处理一次。初始化时不用等1分钟更新,3秒后就更新数据,不过值调用一次
        m_pLoopTimer->start(1000 * 60 * 1);   //1分钟更新
        //m_pLoopTimer->start(1000 * 10);   //10秒更新
    }
}

原文地址:https://www.cnblogs.com/tingtaishou/p/11993214.html

时间: 2024-11-05 16:12:33

QT http请求数据的相关文章

node.js搭建代理服务器请求数据

1.引入node.js中的模块 1 var http = require("http"); 2 var url = require("url"); 3 var qs = require("querystring"); 2.创建服务器 //用node中的http创建服务器 并传入两个形参 http.createServer(function(req , res) { //设置请求头 允许所有域名访问 解决跨域 res.setHeader("

Java服务器对外提供接口以及Android端向服务器请求数据

讲解下java服务器是如何对移动终端提供接口的,以什么数据格式提供出去,移动端又是怎么请求服务器,接收以及解析返回数据的. 服务端:还是在原先S2SH框架的项目上(搭建SSH详细步骤及其相关说明),加入Servlet来做对终端提供接口的事情. Android端:用了一个网络访问框架okHttp,向服务器请求数据. 服务端: servlet接收移动端的get.post请求,进行相应逻辑处理后将要返回的数据封装成json格式写出去. 对数据库的操作传统的Servlet是用jdbc,但是操作过于繁琐,

AJAX跨域请求数据

由于浏览器的同源策略 ajax请求不可以接收到请求响应回来的数据 请求数据需要调用浏览器的内置构造函数 XMLHttpRequest() 进行 实例对象 var xhr = new XMLHttpRequest(); 注意点 在IE8之前支持的 ActiveXobject("Microsoft.XMLHTTP");  记住要进行兼容处理哦  在这里我就不写了 通过该对象进行获取 获取数据的四种状态  xhr.readyState 该属性保存着请求数据的几种状态 1.xhr.open(请

jQuery基础(Ajax,load(),getJSON(),getScript(),post(),ajax(),同步/异步请求数据)

1.使用load()方法异步请求数据 使用load()方法通过Ajax请求加载服务器中的数据,并把返回的数据放置到指定的元素中,它的调用格式为: load(url,[data],[callback]) 参数url为加载服务器地址,可选项data参数为请求时发送的数据,callback参数为数据请求成功后,执行的回调函数. 2.使用getJSON()方法异步加载JSON格式数据 使用getJSON()方法可以通过Ajax异步请求的方式,获取服务器中的数据,并对获取的数据进行解析,显示在页面中,它的

get和post方式请求数据,jsonp

get方式请求数据: p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 19.0px Consolas; color: #289c97 } p.p2 { margin: 0.0px 0.0px 0.0px 0.0px; font: 19.0px Consolas; color: #060606 } p.p3 { margin: 0.0px 0.0px 0.0px 0.0px; font: 19.0px Consolas; color: #4663cc }

Struts2请求数据自动封装和数据类型转换

方式1:jsp表单数据填充到action中的属性: 方式2:jsp表单数据填充到action的对象的属性: 方式1: 第一步:引包,省去 第二步:配置struts2的过滤器 1 <?xml version="1.0" encoding="UTF-8"?> 2 <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmln

向后端请求数据 以及像后端发送数据要求(删除数据和添加数据)

删除数据和添加数据只能后端操作 删除数据和添加数据都要用到的html(一)部分 <!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8"> <title>Title</title> <link rel="stylesheet" href="../css/bootstrap.min.css"

I/O 请求数据包

MSDN原文:https://msdn.microsoft.com/zh-cn/library/windows/hardware/hh439638(v=vs.85).aspx 发送到设备驱动程序的大部分请求都打包在 I/O 请求数据包 (IRP) 中.操作系统组件或驱动程序将 IRP 发送到驱动程序,方法是调用 IoCallDriver,它有两个参数:指向 DEVICE_OBJECT 的指针和指向 IRP 的指针.DEVICE_OBJECT 具有指向关联 DRIVER_OBJECT 的指针.当组

http请求数据的格式

最近看了tinyhttpd的服务器代理,看了看http请求数据包的格式和内容 http请求报包含三个部分: 请求行 + 请求头 + 数据体 请求行包含三个内容 method + request-URI + http-version method 包含有 post , get, head,delete, put, connect, options, patch, propfind, propatch, mkcol, copy, move, lock, unlock, trace, head 方法: