BlueRoseNote/07-Other/Qt/QtQuick/QtQuick大坑笔记之Http的Get与Post操作(带cookie).md
2023-06-29 11:55:02 +08:00

113 lines
4.1 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

## 前言
最近在为单位做一个简单的手机App基于Qt技术栈的选择了QtQuick来开发。不得不说QtQucik开发的确舒服很多东西都不用写就可以只用UI定义起来也比较自由。但是本人想通过cookie来作为登陆验证时就发现QtQuick实现起来相当麻烦。主要是没有文档资料只找到一篇qyvlik写的。我也不想直接用WebEngine
## 不带cookie
可以使用XMLHttpRequest比较坑的是官方竟然没有任何案例不过Api都是与js的XmlHttpRequest一样的以下是qyvlik封装的一套分辨操作函数
```
//通过Json对象输出url的query字符串
function urlQuery(jsonObject) {
var query = "";
var i = 0;
for(var iter in jsonObject) {
if(i > 0) {
query += "&";
}
query += iter +"=" + encodeURI(jsonObject[iter]);
i++;
}
// console.log("url query:", query);
return query;
}
//设置头
function setHeader(xhr, headers) {
//"Content-Type":"application/x-www-form-urlencoded"
for(var iter in headers) {
xhr.setRequestHeader(iter, headers[iter]);
}
}
//这里我修改了一下函数的形参从使用的角度来看回调函数一般都会有但是headers不一定要设置所以调换了一下位置
function ajax(method, url, callable,headers,data) {
headers = headers || {};
callable = callable || function(xhr) {
console.log("没有设置callable使用默认log函数")
console.log(xhr.status);
console.log(xhr.responseText);
}
var xhr = new XMLHttpRequest;
xhr.onreadystatechange = function() {
if(xhr.readyState == xhr.DONE) {
callable(xhr);
}
}
xhr.open(method, url);
setHeader(xhr, headers);
if("GET" === method) {
xhr.send();
} else {
xhr.send(data);
}
}
```
为了能够重复利用本人将这些代码都放入一个js文件中之后使用导入的方式重复利用。注意导入的命名控件首字母需要大写
```
import "xmlhttprequest.js" as XmlHttpRequest
```
使用:
```
var jsonObject={user:"admin",password:Qt.md5("123")};
XmlHttpRequest.ajax("GET","http://192.168.3.108:3000/landing"+"?"+XmlHttpRequest.urlQuery(jsonObject),function(xhr){
console.log(xhr.status);
console.log(xhr.responseText);
if(JSON.parse(xhr.responseText).message==="ok") {
stack.push("qrc:/resource/qml/listview.qml",{stack:stack,uifont:uifont});
}else{
message.show("用户名或者密码错误!",2000);
}
});
```
## 带cookie
因为XmlHttpRequest是不能带有cookie的所以只能通过c++导出QNetworkAccessManager、QNetworkRequest、QNetworkReply具体的代码可以参考https://github.com/qyvlik/QmlNetwork。qyvlik封装了一套QML对象我直接拿来用了很可惜他的使用说明写的不太详细有一些操作需要直接看他写的微信案例才能搞定。
```
NetworkAccessManager { id: manager }
NetworkResponse { id: response }
NetworkRequest { id: request }
Buffer { id: buffer }
function initWebWeiXinInfo() {
var url = "http://192.168.3.108:3000/landing";
var data = {
user:"admin",
password:"123"
};
if(buffer.isOpen()) {
buffer.close();
}
buffer.data = JSON.stringify(data);
if(!buffer.open(IODevice.ReadOnly)) {
console.log(buffer.errorString());
}
request.clear();
request.url = url;
// request.setHeader("Cookie", cookie);
request.setHeader("Content-Type", "application/json")
request.ioDevice = buffer;
connectSignalOnce(response.finished,function() {
console.log("data:", buffer.data)
var headers = response.getAllResponseHeaders();
for(var iter in headers) {
console.log(headers[iter]);
}
console.log(response.responseContent);
});
manager.post(request, response);
}
```
## 结语
感觉qyvlik封装的东西比较多需求上本人也就用用Get与Post以及cookie以后有时间会重新封装一个简单版本。