Все сетевые процессы в приложении, подразумевающие обмен информацией между сетевыми адресами и приложением, поддерживаются сетевыми запросами. Эти запросы могут быть выполнятся как сигнальные обмены между приложением и сервисом объектов, осуществляя поддержку непрерывного подключения и выгрузки актуальной информации в центральный сервис объектов, а также загрузки пакета листов или базы геоданных в качестве примеров.
Создание сетевого запросов
В основном сетевой запрос осуществляется с помощью компонента 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
}
}
Свойство progress, возвращаемое сигналом onProgressChanged, описывает процесс сетевого запроса в форме десятичного значения от 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
}
}