【问题标题】:Unable to load JSON DataSource over https in BlackBerry Cascades无法在 BlackBerry Cascades 中通过 https 加载 JSON 数据源
【发布时间】:2025-11-27 10:00:02
【问题描述】:

通过 https 加载我的 JSON 数据源似乎失败了。当我在 BlackBerry 10 设备上的浏览器中加载 url 时它可以工作,但当我尝试在 Qml 中使用该 url 时失败。

这是我的 DataSource 对象的样子:

DataSource {
    id: dsTitles
    source: ""
    type: DataSourceType.Json
    onDataLoaded: {
        if (Common.hasError(updateError, data, "Failed to load data. Please check your connection and try again.")) {
            console.log("Data contains error");
            navigationPane.pop();
            return;
        }
        loadedTitles = true;
        Code.loadDropDown(data, ddTitle, "title", "titleId")
        Code.hideLoadIndicator();
        if (updateProfile && ddTitle.selectedValue == null) {
            Code.setDropDownOptionByValue(ddTitle, profile.userTitleId);
        }
    }
    onError: {
        console.log("Failed to load titles: " + errorMessage);
    }

任何 https JSON web 服务都可以用作此问题的示例。

【问题讨论】:

    标签: javascript qml blackberry-cascades


    【解决方案1】:

    可以使用 XMLHttpRequest 从 JavaScript 加载数据。我创建了以下两个函数:

    函数 loadJsonDataList(value, dataModel) { for (var i = 0; i

    函数 loadData(url, onComplete) { var request = new XMLHttpRequest();

    request.open("GET", url);
    request.send();
    
    request.onreadystatechange = function() {
        if (request.readyState === 4 && request.status === 200) {
            onComplete(JSON.parse(request.responseText));
        } else {
    
            onComplete(request.responseText);
        }
    };
    

    }

    上面的函数可以使用如下:

    function getData2() 
    {
        console.log("Get data called");
        Common.loadData("https://mywebservice/here/someFunction", getDataCallBack);
    }
    
    function getDataCallBack(dataObject) 
    {
        console.log("Get data callback called");
        Common.loadJsonDataList(dataObject, lstViewItems.dataModel);
    }
    

    目前,Qml DataSource 对象似乎无法加载 SSL Web 服务数据,但是可以如上所述手动加载它。如果他们最终解决了这个问题,或者另一个答案可以解释如何以这种方式使用 DataSource,我会尝试关注这个问题并更新答案。

    【讨论】:

      【解决方案2】:

      我终于在我的数据源中使用 https 解决了这个问题。通过显式声明remote : true

      这现在似乎解决了无法加载安全 JSON 源的问题。

      【讨论】:

        【解决方案3】:

        您不能对源使用 http 值,您需要实际下载 JSON 文件,然后将其传递给数据源。

        blackberry 的“Weatherguesser”示例应用程序展示了如何从在线资源中获取数据并将其传递给您的 qml。

        具体看一下weathermodel.cpp文件,它从在线的json文件中下载天气数据。

        简而言之,您将需要一个 NetworkAccessManager,然后需要将一个 url 传递给它以进行下载。然后可以在 c++ 中管理结果,也可以将其直接传递给 qml。

        【讨论】:

        • 抱歉,我一直在使用其他对象(例如图像视图)并且源需要本地路径。
        • 如果 Qml 数据源不支持 https,我可能不得不使用 NetworkAccessManager。但是,DataSource 的所有便利都将不在窗口中,所以这绝对是最后的手段。