Javascript XMLHttpRequest在QML Blackberry 10中不工作
在给定的代码中,我使用了一个标签和一个按钮。我希望当我点击按钮时,必须发送一个请求,从给定的链接获取Json并在标签上打印。但对于这段代码,我只是在成功后在标签内打印“OK” 我所面临的问题是,我没有进入if声明。实际上,按一下按钮什么也没发生。我知道QT中有一个网络管理器,我可以使用它,但在我的情况下,我想在QML内部进行解析Javascript XMLHttpRequest在QML Blackberry 10中不工作,javascript,qml,blackberry-10,blackberry-cascades,Javascript,Qml,Blackberry 10,Blackberry Cascades,在给定的代码中,我使用了一个标签和一个按钮。我希望当我点击按钮时,必须发送一个请求,从给定的链接获取Json并在标签上打印。但对于这段代码,我只是在成功后在标签内打印“OK” 我所面临的问题是,我没有进入if声明。实际上,按一下按钮什么也没发生。我知道QT中有一个网络管理器,我可以使用它,但在我的情况下,我想在QML内部进行解析 // Default empty project template import bb.cascades 1.0 // creates one page with a
// Default empty project template
import bb.cascades 1.0
// creates one page with a label
Page {
Container {
layout: StackLayout {}
Label {
id: msgLabel
text: qsTr("Hello World")
textStyle.base: SystemDefaults.TextStyles.BigText
verticalAlignment: VerticalAlignment.Center
horizontalAlignment: HorizontalAlignment.Center
}
Button {
id: requestXML
objectName: "requestXML"
onClicked: {
var doc = new XMLHttpRequest();
doc.onreadystatechange = function() {
if (doc.readyState == 4) {
msgLabel.text="OK"
// pass “doc.responseText” to C++ for Parsing
}
}
doc.open("GET", "http://www.example.com/sample.json", true);
doc.send();
}
}
}
}
在我的.pro文件中,我声明
CONFIG += qt warn_on cascades10
QT += network
CONFIG += debug
CONFIG += console
LIBS += -lbbdata
QT +=script
QT +=scripttools
我错在哪里?或者我必须声明一些其他的东西,所以我不能为您正确地测试它。但这对其他JSON文件也适用。对于本例,在.pro文件中只需要LIBS+=-lbbdata。此外,阅读和阅读。如果我是你,我会通过C++下载JSON。
import bb.cascades 1.0
import bb.data 1.0
Page {
Container {
layout: StackLayout {
}
Label {
id: msgLabel
text: qsTr("Hello World")
textStyle.base: SystemDefaults.TextStyles.BigText
verticalAlignment: VerticalAlignment.Center
horizontalAlignment: HorizontalAlignment.Center
}
Button {
id: requestXML
onClicked: {
dataSource.load();
}
}
attachedObjects: [
DataSource {
id: dataSource
source: "https://api.twitter.com/1.1/statuses/user_timeline.json?include_entities=true&include_rts=true&screen_name=ladygaga"
type: DataSourceType.Json
onDataLoaded: {
console.log("loaded");
console.log(JSON.stringify(data)); //just for testing
console.log(data);
}
onError: {
console.log(errorType);
console.log(errorMessage);
}
}
]
}
此外,您使用的Twitter API不再可用,请检查,否则您将出现以下错误:
{"errors": [{"message": "The Twitter REST API v1 is no longer active. Please migrate to API v1.1. https://dev.twitter.com/docs/api/1.1/overview.", "code": 68}]}
我认为问题在于默认情况下不允许的跨域请求。在
WebWorks
中,您需要为希望访问的域声明一个文件
不幸的是,我不知道如何在本机QML
项目中执行同样的操作。bar descriptor.xml
中的现有元素不允许执行类似的操作
添加:
我编写了一个简单的HTTP存根来测试这种猜测,看起来这确实是导致问题的原因:
$ echo -e 'HTTP/1.1 200 OK\n\n' | nc -l 8080
GET /user_timeline.json?include_entities=true&include_rts=true&screen_name=ladygaga HTTP/1.1
CONTENT-TYPE: application/x-www-form-urlencoded
Connection: Keep-Alive
Accept-Encoding: gzip
Accept-Language: en-GB,*
User-Agent: Mozilla/5.0
Host: 192.168.1.106:8080
在这种情况下,我得到XMLHttpRequest.status==200
,而在访问Twitter端点时,我得到了相同代码的XMLHttpRequest.status==0
:
import bb.cascades 1.0
Page {
Container {
layout: StackLayout {
}
Label {
id: msgLabel
text: qsTr("Hello World")
textStyle.base: SystemDefaults.TextStyles.BigText
verticalAlignment: VerticalAlignment.Center
horizontalAlignment: HorizontalAlignment.Center
}
Button {
id: requestXML
objectName: "requestXML"
onClicked: {
sendRequest();
}
}
}
function sendRequest() {
var ajax = new XMLHttpRequest();
ajax.onreadystatechange = function() {
if (ajax.readyState === XMLHttpRequest.DONE) {
console.log("ajax.status: " + ajax.status);
if (ajax.status === 200) {
console.log("Response = " + ajax.responseText);
} else {
// This is very handy for finding out why your web service won't talk to you
console.log("Status: " + ajax.status + ", Status Text: " + ajax.statusText);
}
}
}
// var url = "http://192.168.1.106:8080/user_timeline.json?include_entities=true&include_rts=true&screen_name=ladygaga";
var url = "https://api.twitter.com/1.1/statuses/user_timeline.json?include_entities=true&include_rts=true&screen_name=ladygaga";
ajax.open("GET", url, true); // only async supported
ajax.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded')
ajax.send();
}
}
asset:///main.qml:29: 语法错误:解析错误;这就是doc.open(…)您正在使用旧的twitter API<代码>{“错误”:[{“消息”:“Twitter REST API v1不再处于活动状态。请迁移到API v1.1。https://dev.twitter.com/docs/api/1.1/overview.“,“code”:68}]}
@bojankogj这里的问题不在于Twitter API。主要的问题是,我没有从任何JSON链接中得到任何响应。看看我的答案,它是有效的。我还建议看看哪个封装在级联中™ 对于BlackBerry 10项目和支持v1.1的Twitter应用程序来说,这很好。但是我可以问一下我的代码有什么问题吗?我不知道,也许它不受支持。