Richieste di rete

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