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