Demande réseau

Tous les processus réseau d'une application sont gérés par les demandes réseau, un échange d'informations entre une adresse réseau et une application. Ces demandes peuvent signaler des échanges entre l'application et un service d'entités pour assurer une connexion continue et des informations à jour, télécharger des réponses de formulaire vers un service d'entités central ou télécharger un paquetage de tuiles ou une géodatabase, par exemple.

Création d'une demande réseau

L'essentiel d'une demande réseau est géré par le composant NetworkRequest. Ce composant contient les configurations, la destination et les paramètres de la demande, ainsi que des fonctions aidant à surveiller le processus de la demande.

L'exemple de code suivant présente le processus de téléchargement d'un fichier à partir d'une source en ligne, en l'occurrence une image. La console affiche le processus du téléchargement, ainsi que l'adresse URL du fichier téléchargé sur le périphérique une fois la demande terminée.

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 propriété progress, signalée par le signal onProgressChanged, décrit le processus de la demande réseau sous la forme d'une valeur décimale comprise entre 0.0 et 1.0. Cette propriété considère les moitiés d'envoi et de réception de la demande de poids égal, ce qui signifie que cette valeur progressera rarement à un rythme linéaire ; par exemple, le fait d'ajouter cet exemple de code à l'exemple ci-dessus aura pour effet d'afficher une barre de progression pour le téléchargement d'image. Toutefois, cette barre de progression passera rapidement de l'état vide au point de mi-chemin (car la portion d'envoi de la demande est très petite) avant de progresser sur le trajet restant à un rythme lent en comparaison.

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

En-têtes réseau

L'en-tête d'une demande réseau fournit à l'adresse de destination des informations d'identification sur la source de la demande. Le composant NetworkRequestHeaders gère ceci et peut être utilisé via la propriété headers pour définir des informations alternatives dans ces en-têtes.

Le composant NetworkRequestHeaders comporte deux propriétés permettant d'écrire dans ces espaces. La propriété Referrer décrit l'adresse d'origine de la demande, tandis que la propriété userAgent décrit le logiciel utilisé pour y accéder. Par défaut, ces propriétés retournent des valeurs reflétant l'application mais peuvent être définies autrement. Le code d'exemple suivant envoie une demande de téléchargement se décrivant elle-même comme provenant de la page d'accueil d’ArcGIS Online à l'aide de 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
    }
}