Tutti i processi di rete in un'app vengono gestiti da richieste di rete, uno scambio di informazioni tra un indirizzo di rete e un'app. Tali richieste possono essere scambi di segnali tra l'app e un servizio di una feature per garantire un collegamento continuo e informazioni aggiornate, caricando risposte di moduli in un servizio centrale di feature o scaricando un pacchetto tile o un geodatabase, ad esempio.
Creare una richiesta di rete
La gran parte di una richiesta di rete è gestita dal componente NetworkRequest. Questo componente contiene le configurazioni, la destinazione e le impostazioni della richiesta, nonché una serie di funzioni di aiuto al monitoraggio del processo della richiesta.
Il seguente esempio di codice mostra il processo del download di un file da una fonte online; in questo caso, un'immagine. La console visualizza il processo del download, nonché l'URL del file scaricato sul dispositivo quando la richiesta è completa.
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
}
}
La proprietà progress, riportata dal segnale onProgressChanged, descrive il processo della richiesta di rete sotto forma di valore decimale da 0,0 a 1,0. Questa proprietà dà lo stesso peso a entrambe le parti della richiesta, la emittente e la ricevente, il che significa che raramente questo valore avanzerà ad un intervallo lineare; ad esempio, se si aggiunge questo esempio di codice a quello precedente si visualizzerà un barra di avanzamento per il download dell'immagine. Tuttavia, la barra di avanzamento passerà rapidamente dallo zero al punto intermedio (dal momento che la porzione di invio della richiesta è molto piccola) prima di proseguire il proprio avanzamento lungo il resto della barra ad una velocità molto inferiore rispetto a quella iniziale.
ProgressBar {
id: progressBar
visible: true
anchors {
left: parent.left
leftMargin: 10
right: parent.right
rightMargin: 10
}
value: networkRequest.progress
}
Intestazioni di rete
L'intestazione di una richiesta di rete fornisce informazioni identificative all'indirizzo di destinazione circa l'origine della richiesta. È il componente NetworkRequestHeaders a gestirle e può essere usato attraverso la proprietà headers per definire informazioni alternative per le intestazioni.
NetworkRequestHeaders ha due proprietà utilizzabili per scrivere in queste aree. La proprietà Referrer descrive l'indirizzo di origine della richiesta, mentre la proprietà userAgent descrive il software usato per accedervi. Per impostazione predefinita, queste proprietà restituirà dei valori che rispecchiano l'app, ma possono anche essere impostate diversamente. Il seguente esempio di codice invia una richiesta di upload che si descrive come proveniente dalla home page di ArcGIS Online se si usa 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
}
}