Сетевые запросы

Все сетевые процессы в приложении, подразумевающие обмен информацией между сетевыми адресами и приложением, поддерживаются сетевыми запросами. Эти запросы могут быть выполнятся как сигнальные обмены между приложением и сервисом объектов, осуществляя поддержку непрерывного подключения и выгрузки актуальной информации в центральный сервис объектов, а также загрузки пакета листов или базы геоданных в качестве примеров.

Создание сетевого запросов

В основном сетевой запрос осуществляется с помощью компонента 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
    }
}