IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 网络协议 -> Qt与http通讯 -> 正文阅读

[网络协议]Qt与http通讯

前言

qt开发http通讯需要引入的模块与类

pro

QT += network

h

#include <QJsonObject>
#include <QJsonDocument>
#include <QNetworkAccessManager>
#include <QNetworkReply>
QNetworkAccessManager *manager;

cpp

manager = new QNetworkAccessManager(this);
connect(manager,SIGNAL(finished(QNetworkReply*)),this,SLOT(replyFinished(QNetworkReply*)));

具体实现

//post操作
QNetworkRequest request;
QString url="http://"+hHost+":"+QString::number(postPort)+"/cctrl/Channel/equipmentState";
request.setUrl(QUrl(url));
request.setHeader(QNetworkRequest::ContentTypeHeader,"application/x-www-form-urlencoded");
request.setRawHeader("Content_Type","application/json");
QJsonObject logjson;
logjson.insert("gateNo",sSBBH);
logjson.insert("infraredState",yxzt.mid(0,1));
logjson.insert("videoState",yxzt.mid(1,1));
logjson.insert("organismsState",yxzt.mid(2,1));
logjson.insert("IPCState",yxzt.mid(3,1));
logjson.insert("frontDoorState",yxzt.mid(4,1));
logjson.insert("backDoorState",yxzt.mid(5,1));
logjson.insert("frontDoorIsOpen",yxzt.mid(6,1));
logjson.insert("backDoorIsOpen",yxzt.mid(7,1));
//在json中插入图片base64格式:
QImage img;
img.load(picPath+zjhm+"/zp.jpg");
QByteArray ba;
QBuffer buf(&ba);
img.save(&buf,"png",20);
QByteArray hexed=ba.toBase64();
QString pic(hexed);
buf.close();
logjson.insert("certImg",pic);

QJsonDocument doc;
doc.setObject(logjson);
QByteArray bdata=doc.toJson(QJsonDocument::Compact);
manager->post(request,bdata);
//接收返回数据的槽函数
void Widget::replyFinished(QNetworkReply *reply)
{
if(reply->error()==QNetworkReply::NoError)
{
qDebug()<<"operation:"<<reply->operation();
qDebug()<<"status code:"<<reply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt();
qDebug()<<"url:"<<reply->url();
const QByteArray reply_data=reply->readAll();
qDebug()<<"read all:"<<reply_data;

QJsonParseError json_error;
QJsonDocument document = QJsonDocument::fromJson(reply_data,&json_error);
if(json_error.error==QJsonParseError::NoError)
{
if(document.isObject())
{
const QJsonObject obj = document.object();
qDebug()<<"obj:"<<obj;
if(obj.contains("Accept-Language"))
{
QJsonValue value = obj.value("Accept-Language");
qDebug()<<"value"<<value;
}
}
}
else
qDebug()<<"json error:"<<json_error.errorString();
}
reply->deleteLater();
}

http组成

一条http请求基本上分为Url,Header,Body三部分

创建QNetworkRequest

QNetworkRequest request;
request.setUrl(QUrl(url));
//注意setHeader会覆盖先前设置的Header,因此setHeader和setRawHeader只要有一种即可。
request.setHeader(QNetworkRequest::ContentTypeHeader,"application/x-www-form-urlencoded");
request.setRawHeader("Content_Type","application/json");

关于Content_Type

Content_Type,意为数据格式标签,种类有很多,常见的有以下几种:

类型字符串
html文档标记text/html
普通ASCII文档标记text/html
JPEG图片标记image/jpeg
GIF图片标记image/gif
js文档标记application/javascript
xml文件标记application/xml

最常用的是:application/x-www-form-urlencoded 和 application/json
两者设置Body参数的方法是不一样的。
前者:

QByteArray body;body.append("option=pencil&");//两个参数之间用&连接
body.append("image=");
body.append(QUrl::toPercentEncoding(Picbase64));//picbase64为存放base64格式图片的QByteArray
manager->post(request,body);

后者:

QJsonObject postjson;
postjson.insert("image",str_base64);//str_base64为存放base64格式图的QString
postjson.insert("option",m_style);
QJsonDocument doc;
doc.setObject(postjson);
QByteArray postdata = doc.toJson(QJsonDocument::Compact);
manager->post(request,postdata);

实例

利用百度翻译API编写翻译器

widget.h

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
#include <QJsonObject>
#include <QJsonDocument>
#include <QJsonArray>
#include <QJsonValue>
#include <QNetworkAccessManager>
#include <QNetworkReply>
#include <QUrl>
#include <QUrlQuery>
#include <QSettings>

QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACE

class Widget : public QWidget
{
    Q_OBJECT

public:
    Widget(QWidget *parent = nullptr);
    ~Widget();

private slots:
    void replyFinished(QNetworkReply *reply);//接受返回数据槽函数
    void on_pushButton_clicked();

    void on_pushButton_2_clicked();

    void on_pushButton_3_clicked();

    void on_pushButton_4_clicked();

    void on_btn_mode_clicked();

    void on_btn_go_clicked();

    void on_cb_from_currentIndexChanged(const QString &arg1);

    void on_cb_to_currentIndexChanged(const QString &arg1);

private:
    Ui::Widget *ui;
    QNetworkAccessManager *manager;
    bool mode=true;
    QString from;
    QString to;
//翻译方法:参数一:源文字。参数二:源语言
    void translate(QString lang_src,QString lang_dst);
};
#endif // WIDGET_H

widget.cpp

#include "widget.h"
#include "ui_widget.h"
#include "stdlib.h"

Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);
    manager = new QNetworkAccessManager(this);
    connect(manager,&QNetworkAccessManager::finished,this,&Widget::replyFinished);
    this->setWindowFlags(Qt::WindowStaysOnTopHint);
    this->setWindowTitle("翻译器-mja V3.0");
    ui->wid_pro->setVisible(false);
    QSettings setini("set.ini");
    ui->cb_from->setCurrentIndex(setini.value("set/from",0).toInt());
    ui->cb_to->setCurrentIndex(setini.value("set/to",0).toInt());
    from=setini.value("set/lang_src","zh").toString();
    to=setini.value("set/lang_dst","zh").toString();
    setini.deleteLater();
}

Widget::~Widget()
{
    delete ui;
}

void Widget::replyFinished(QNetworkReply *reply)
{
    if(reply->error()==QNetworkReply::NoError)
    {
        QByteArray ba = reply->readAll();
        QJsonDocument doc = QJsonDocument::fromJson(ba);
        QJsonObject obj = doc.object();
        qDebug()<<obj;
        QJsonArray qa = obj.value("trans_result").toArray();
        QJsonValue qv = qa.takeAt(0);
        QJsonObject obj2 = qv.toObject();
        QString res = obj2.value("dst").toString();
        ui->textEdit->append(res);
    }
}

void Widget::on_pushButton_clicked()
{
    translate("zh","en");
}

void Widget::on_pushButton_2_clicked()
{
    translate("en","zh");
}

void Widget::translate(QString lang_src, QString lang_dst)
{
    ui->textEdit->clear();
    QNetworkRequest request;
    QUrl url("http://fanyi-api.baidu.com/api/trans/vip/translate");
    int a = rand();
    //***为appid和密钥,请自行去百度申请
    QString str1="********"+ui->lineEdit->text()+QString::number(a)+"***********";
    QByteArray ba = QCryptographicHash::hash(str1.toUtf8(),QCryptographicHash::Md5);
    QString str2=ba.toHex();
    QUrlQuery qry;
    qry.addQueryItem("q",ui->lineEdit->text());
    qry.addQueryItem("from",lang_src);
    qry.addQueryItem("to",lang_dst);
    qry.addQueryItem("appid","20211207001021383");
    qry.addQueryItem("salt",QString::number(a));
    qry.addQueryItem("sign",str2);
    qry.addQueryItem("dict","0");
    url.setQuery(qry);
    request.setUrl(url);
    manager->get(request);
}

void Widget::on_pushButton_3_clicked()
{
    translate("zh","jp");
}

void Widget::on_pushButton_4_clicked()
{
    translate("jp","zh");
}

void Widget::on_btn_mode_clicked()
{
    if(mode)
    {
        mode=false;
        ui->wid_simple->setVisible(false);
        ui->wid_pro->setVisible(true);
        ui->btn_mode->setText("普");
    }
    else
    {
        mode=true;
        ui->wid_simple->setVisible(true);
        ui->wid_pro->setVisible(false);
        ui->btn_mode->setText("简");
    }
}

void Widget::on_btn_go_clicked()
{
    translate(from,to);
}

void Widget::on_cb_from_currentIndexChanged(const QString &arg1)
{
    from=arg1.mid(arg1.indexOf("-")+1,arg1.length());
    QSettings setini("set.ini");
    setini.setValue("set/from",ui->cb_from->currentIndex());
    setini.deleteLater();
}

void Widget::on_cb_to_currentIndexChanged(const QString &arg1)
{
    to=arg1.mid(arg1.indexOf("-")+1,arg1.length());
    QSettings setini("set.ini");
    setini.setValue("set/to",ui->cb_to->currentIndex());
    setini.deleteLater();
}

  网络协议 最新文章
使用Easyswoole 搭建简单的Websoket服务
常见的数据通信方式有哪些?
Openssl 1024bit RSA算法---公私钥获取和处
HTTPS协议的密钥交换流程
《小白WEB安全入门》03. 漏洞篇
HttpRunner4.x 安装与使用
2021-07-04
手写RPC学习笔记
K8S高可用版本部署
mySQL计算IP地址范围
上一篇文章      下一篇文章      查看所有文章
加:2022-09-13 11:52:32  更:2022-09-13 11:56:02 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/19 9:10:03-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码