Solicitudes de red

Todos los procesos de red en una aplicación se gestionan a través de solicitudes de red, un intercambio de información entre direcciones de red y una aplicación. Estas solicitudes pueden estar señalando intercambios entre la aplicación y un servicio de entidades para asegurar una conexión continuada e información actualizada, subiendo respuestas de formulario a un servicio de entidades central, o descargando un paquete de teselas o geodatabase, como ejemplos.

Crear una solicitud de red

La mayoría de solicitudes de red se gestionan a través del componente NetworkRequest. Este componente contiene las configuraciones, el destino y los ajustes de la solicitud, además de numerosas funciones para ayudar a monitorizar el proceso de solicitud.

En la siguiente muestra de código aparece el proceso de descarga de un archivo desde una fuente en línea, en este caso, una imagen. La consola muestra el proceso de descarga, además de la URL del archivo descargado en el dispositivo cuando se completa la solicitud.

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 propiedad progress, notificada por la señal onProgressChanged, describe el proceso de la solicitud de red en forma de valor decimal de 0.0 a 1.0. Esta propiedad considera del mismo peso ambas mitades de la solicitud, tanto la de enviar como la de recibir, por lo cual este valor raramente progresará de forma lineal. Por ejemplo, al agregar esta muestra de código a la anteriormente mencionada se mostrará una barra de progreso para la imagen descargada. Sin embargo, esta barra de progreso pasará rápidamente de estar vacía al punto medio (ya que la parte enviada de la solicitud es muy pequeña) antes de que el resto del progreso avance relativamente despacio.

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

Encabezados de red

El encabezado para una solicitud de red proporciona información identificadora a la dirección de destino acerca del origen de la solicitud. El componente NetworkRequestHeaders gestiona esto, y se puede utilizar a través de la propiedad headers para definir información alternativa en estos encabezados.

NetworkRequestHeaders cuenta con dos propiedades que se pueden utilizar para escribir estas áreas. La propiedad Referrer describe la dirección de origen de esta solicitud, mientras que la propiedad userAgent describe el software utilizado para acceder a ella. De forma predeterminada, estas propiedades devolverán valores reflejo de la aplicación, pero se pueden definir de otra forma. La siguiente muestra de código envía una solicitud de carga que se describe a sí misma como proveniente de la página de inicio ArcGIS Online utilizando 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
    }
}