Netzwerkanforderungen

Alle Netzwerkprozesse in einer App werden von Netzwerkanforderungen verarbeitet, einem Informationsaustausch zwischen einer Netzwerkadresse und einer App. Bei diesen Anforderungen kann es sich um den Austausch von Signalen zwischen der App und einem Feature-Service handeln, um eine kontinuierliche Verbindung und aktuelle Informationen zu gewährleisten, etwa beim Hochladen von Formularantworten in einen zentralen Feature-Service oder beim Herunterladen eines Kachelpakets bzw. einer Geodatabase, um nur einige Beispiele zu nennen.

Erstellen einer Netzwerkanforderung

Eine Netzwerkanforderung wird überwiegend von der NetworkRequest-Komponente verarbeitet. Diese Komponente enthält die Konfigurationen, das Ziel und die Einstellungen der Anforderung sowie mehrere Funktionen, die unterstützend bei der Überwachung des Anforderungsprozesses mitwirken.

Im folgenden Codebeispiel wird das Herunterladen einer Datei, in diesem Fall eines Bildes, aus einer Online-Quelle veranschaulicht. In der Konsole werden der Prozess des Herunterladens sowie die URL der heruntergeladenen Datei auf dem Gerät angezeigt, wenn die Anforderung abgeschlossen ist.

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
    }
}

In der Eigenschaft progress, die vom Signal onProgressChanged gemeldet wird, wird der Prozess der Netzwerkanforderung in Form eines Dezimalwerts zwischen 0,0 und 1,0 angegeben. In dieser Eigenschaft werden sowohl die sendende als auch die empfangende Hälfte der Anforderung mit gleicher Gewichtung berücksichtigt, was bedeutet, dass dieser Wert selten linear ansteigt. Wird dieses Codebeispiel beispielsweise dem obigen hinzufügt, wird eine Fortschrittsleiste für den Bild-Download angezeigt. Die Fortschrittsleiste springt jedoch rasch von Null auf 50 % (da der Sendebestandteil der Anforderung sehr klein ist), während sich der Balken in der zweiten Hälfte vergleichsweise langsam verändert.

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

Netzwerk-Header

Der Header einer Netzwerkanforderung stellt der Zieladresse identifizierende Informationen über die Anforderungsquelle bereit. Die NetworkRequestHeaders-Komponente ist für die Verarbeitung zuständig. Mit ihr können über die Eigenschaft headers alternative Informationen in diesen Headern definiert werden.

NetworkRequestHeaders besitzt zwei Eigenschaften, mit denen in diese Bereiche geschrieben werden kann. In der Eigenschaft Referrer wird die ursprüngliche Adresse der Anforderung angegeben und in der Eigenschaft userAgent die Software, mit der darauf zugegriffen wird. Standardmäßig geben diese Eigenschaften Werte zurück, die sich auf die App beziehen, aber anderweitig definiert werden können. Im folgenden Beispielcode wird eine Upload-Anforderung gesendet, in der angegeben wird, dass sie von der Homepage ArcGIS Online unter Verwendung von Mozilla Firefox ausgeführt wird.

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
    }
}