网络请求

应用程序中的所有网络进程均由网络请求处理,网络请求即在网络地址和应用程序之间交换信息。这些请求可以是应用程序和要素服务之间用于确保持续连接和最新信息的信号交换,也可以是对中央要素服务的上传形式响应,或者是下载切片包和地理数据库等内容。

创建网络请求

大多数的网络请求由 NetworkRequest 组件处理。该组件包含请求的配置、目的地和设置,以及一系列可用于监控请求进程的函数。

以下代码示例显示了从在线源下载文件(在该示例中为图像)的过程。控制台显示下载过程,如果请求完整,还会显示下载到设备上文件的 URL。

QtObject {
    id: internal
    property url folderUrl: AppFramework.userHomeFolder.fileUrl("ArcGIS/Runtime/Data");
}
FileFolder { //Creates FileFolder object to handle filepath
    id: fileFolder
    url: internal.folderUrl
    Component.onCompleted: {
        if (!fileFolder.exists) {
            fileFolder.makeFolder(internal.folderUrl);
        }
    }
}
//Downloads an image from the web
NetworkRequest {
    id: networkRequest
    url: "http://appstudio.arcgis.com/images/index/introview.jpg"
    responsePath: fileFolder.path +"/appstudio.jpg"
    property url imagePath: responsePath
    onReadyStateChanged: {
        if (readyState === NetworkRequest.DONE) {
            console.log(networkRequest.url, networkRequest.responsePath)
            image.source = internal.folderUrl+"/appstudio.jpg";
        }
    }
    onProgressChanged: console.log("progress:", progress)
    onError: {
        console.log(errorText + ", " + errorCode)
        //On failure, don't use the local copy
        image.source = ""
    }
}
ColumnLayout {
    spacing: 20
    anchors {
        left: app.left
        top: app.top
        margins: 20
    }
    Button {
        id:download
        text: "Download Request (Download Image)"
        Layout.margins: 2
        Layout.fillWidth: true
        onClicked: {
            networkRequest.send({f:"json"});
        }
    }
    Button {
        id: clear
        text: "Clear"
        Layout.margins: 2
        Layout.fillWidth: true
        onClicked: {
            image.source = ""
        }
    }
    Image {
        id: image
        Layout.margins: 10
        Layout.preferredWidth: 250
        Layout.preferredHeight: 200
    }
}

onProgressChanged 信号报告的 progress 属性,以介于 0.0 到 1.0 之间小数的形式说明网络请求的过程。该属性将等量考虑请求的发送部分和接收部分,这表示该值很少以线性速率发展;例如,向其中一个以上内容添加此代码示例将显示下载图像的进度条。但是,该进度条会快速从空的位置点跳至一半的位置点(因为请求的发送部分非常小),而后续进展相比之下较为缓慢。

ProgressBar {
    id: progressBar
    visible: true
    anchors {
        left: parent.left
        leftMargin: 10
        right: parent.right
        rightMargin: 10
    }
    value: networkRequest.progress
}

网络头

网络请求的头提供关于请求源目的地地址的识别信息。NetworkRequestHeaders 组件可处理该请求,并且可通过 headers 属性来使用以定义这些请求头中的备用信息。

NetworkRequestHeaders 有两个可用于写入这些区域的属性。Referrer 属性说明请求的原始地址,而 userAgent 属性则说明用于访问此地址的软件。默认情况下,这些属性将返回反映应用程序的值,但是也可以另行定义。以下示例代码发送上传请求,说明请求本身来自 ArcGIS Online 主页(使用 Mozilla Firefox)。

NetworkRequest {
    id: uploadRequest
    url: "http://sampleserver6.arcgisonline.com/arcgis/rest/services/Wildfire/FeatureServer/1/applyEdits"
    method: "POST"
    headers.referrer: "https://www.arcgis.com/home/index.html"
    headers.userAgent: "Mozilla/5.0"
    onReadyStateChanged: {
        if ( readyState === NetworkRequest.DONE ) {
            result.text = responseText
        }
    }
    onError: result.text = errorText + ", " + errorCode
}
ColumnLayout {
    spacing: 20
    anchors {
        left: app.left
        top: app.top
        margins: 20
    }
    Button {
        id:upload
        text: "Upload Request"
        Layout.margins: 2
        Layout.fillWidth: true
        onClicked: {
            uploadRequest.send({adds:"[{\"attributes\":{\"description\":\"Networkrequest Sample\",\"symbolid\":\"13\",\"timestamp\":null},\"geometry\":{\"paths\":[[[-11542803.322978519,3129176.1574580222],[-3547788.0343353897,8625749.168400176],[-5746417.238712249,-3366773.7645645197]]],\"spatialReference\":{\"latestWkid\":3857,\"wkid\":102100}}}]", f:"json"});
        }
    }
    TextArea {
        id:result
        readOnly: true
        Layout.fillWidth: true
        Layout.margins: 10
        Layout.preferredWidth: 250
        Layout.preferredHeight: 75
    }
}