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"] = "";