Todos os processos de rede em um aplicativo são tratados por pedidos de rede, uma troca de informações entre um endereço de rede e um aplicativo. Estes pedidos podem sinalizar trocas entre o aplicativo e um serviço de feição para assegurar uma conexão continuada e informações atualizadas, transferindo respostas do formulário para um serviço de feição central, ou baixando um pacote de mosaico ou geodatabase, como exemplos.
Criar um pedido de rede
A maioria dos pedidos de rede são tratados pelo componente NetworkRequest. Este componente contém as configurações, destino, e configurações do pedido, como também diversas funções para ajudar a monitorar o processo do pedido.
A amostra de código seguinte mostra o processo para baixar um arquivo de uma fonte online, neste caso, uma imagem. O console mostra o processo de download, assim como a URL do arquivo baixado no dispositivo quando o pedido for finalizado.
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
}
}
A propriedade progress , reportada pelo sinal onProgressChanged , descreve o processo do pedido de rede na forma de um valor decimal de 0.0 a 1.0. Esta propriedade considera enviar e receber metades do pedido de peso igual, o qual significa que este valor raramente progredirá em uma taxa linear; por exemplo, adicionar esta amostra de código para uma acima irá exibir uma barra de progresso do download da imagem. Entretanto, esta barra de progresso irá pular rapidamente de vazia para um ponto médio (já que a parte de envio do pedido é muito pequeno) antes de progredir com o restante de modo comparativamente lento.
ProgressBar {
id: progressBar
visible: true
anchors {
left: parent.left
leftMargin: 10
right: parent.right
rightMargin: 10
}
value: networkRequest.progress
}
Cabeçalhos de rede
O cabeçalho de um pedido de rede fornece informações de identificação para o endereço de destino sobre a origem do pedido. O componente NetworkRequestHeaders trata disto e pode ser utilizado pela propriedade headers para definir informações alternativas nestes cabeçalhos.
O NetworkRequestHeaders tem duas propriedades que podem ser utilizadas para gravar nestas áreas. A propriedade Referrer descreve o endereço de origem do pedido, enquanto a propriedade userAgent descreve o software para acessá-la. Por padrão, estas propriedades retornarão valores refletivos do aplicativo mas pode ser definido caso contrário. O código de amostra seguinte envia o pedido de transferência descrevendo si próprio como de origem da página inicial 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
}
}