使用网络服务

NetworkRequest 能够对 ArcGIS Online 进行 ArcGIS REST API 调用。为此,组件整合了 JavaScript 中 XMLHttpRequest 类的功能和 cURL(客户端 URL)命令行工具。这将允许代码从 JavaScript Web 应用程序迁移到 QML 原生应用程序。

从 XMLHttpRequest 迁移到 NetworkRequest

以下代码示例演示了 JavaScript 和 AppStudio AppFramework 两者相同的功能。当将代码从 JavaScript 迁移到 QML 时,可将其作为指南。

此代码示例使用 JavaScript 中的 XMLHttpRequest 来执行网络请求。

var req = new XMLHttpRequest();
var url = "http://www.arcgis.com/sharing/rest?f=json"
req.open("GET", url, true);
req.onreadystatechange = function() {
    console.log("readyState: ", req.readyState);
    if (req.readyState !== 4) return;
    if (req.status !== 200) return;
    console.log("responseText: ", req.responseText);
}
req.send();

此代码示例使用 AppFramework 中的 NetworkRequest 来执行相同的网络请求。

NetworkRequest {
    id: req
    url: "http://www.arcgis.com/sharing/rest?f=json"
    onReadyStateChanged: {
        console.log("readyState: ", readyState);
        if (readyState !== 4) return;
        if (status !== 200) return;
        console.log("responseText: ", responseText);
    }
}
function test() {
    req.send();
}

ReadyState 枚举

readyState 属性由枚举进行填充,其中整数表示潜在属性值。您可以在应用程序中使用整数值、JavaScript 状态或 NetworkRequest 状态而不改变行为,从而更易于从 XMLHttpRequest 进行迁移。

整数值JavaScript 状态NetworkRequest

0

UNSENT

ReadyStateUninitialized

1

OPENED

ReadyStateInitialized

2

HEADERS_RECEIVED

ReadyStateSending

3

LOADING

ReadyStateProcessing

4

DONE

ReadyStateComplete

文件处理

Web 应用程序和原生应用程序之间的关键差异在于,Web 应用程序无法访问您的文件系统,而原生应用程序可以。这种差异反映在 XMLHttpRequest 无法访问文件,但 NetworkRequest 可以。Web 应用程序中的文件访问请求需使用 cURL 完成,而非 JavaScript。

要使用 cURL 上传文件,您须执行以下操作:

curl \
    -F title="My Code Sample"
    -F type="Code Sample"
    -F tags="Code Sample"
    -F file="@CodeSample.zip"
    -F token="${ARCGIS_ONLINE_TOKEN}"
    http://http://www.arcgis.com/sharing/rest/content/users/jsmith/addItem

NetworkRequest 包含 uploadPrefix 属性,用于处理文件名前所需的字符。此属性的默认值为 @,以保持与 cURL 的兼容性。以下代码示例演示了使用 NetworkRequest 复制的相同行为。

property string user: "jsmith"
property string itemTitle: "My Code Sample"
property string itemType: "Code Sample"
property string itemTags: "Code, Sample"
property string itemFile: "CodeSample.zip"
property string token // ARCGIS_ONLINE_TOKEN
NetworkRequest {
    id: req    url: "http://www.arcgis.com/sharing/rest/content/users/%1/addItem".arg(user)
	function submit() {
        send( {
            "title": itemTitle,            "type": itemType,            "tags": itemTags,            "file": uploadPrefix + itemFile,            "token": token,            "f": "json"
        } );
    }
}

传递至发送方法的 JSON 对象是包含键值字典映射的 JavaScript 对象。NetworkRequest 中的 method 属性描述网络请求的性质。如果此属性留空或未定义,则默认为 GET 请求。如果需要上传文件,则 method 属性必须设置为 POST

默认内容类型

为了简化对 ArcGIS REST API 的请求,NetworkRequest 默认 Content-Type 的标题为 application/x-www-form-urlencoded。当使用 ArcGIS Online REST API 时,必须进行此设置。Content-Type 也适用于大多数其他网站。然而,对于一些特定的网站,例如 Amazon Web Services,可能需要清除此设置:

networkRequest.headers["Content-Type"] = "";