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