Wszystkie procesy sieciowe w aplikacji są obsługiwane przez żądania sieciowe — wymianę informacji między adresem IP a aplikacją. Te żądania mogą sygnalizować wymiany między aplikacją a usługą obiektową na przykład w celu zagwarantowania nieprzerwanego połączenia i aktualnych informacji, przesyłania formularzy odpowiedzi do centralnej usługi obiektowej lub pobrania pakietu kafli albo geobaz.
Tworzenie żądania sieciowego
Większość żądań sieciowych jest obsługiwanych przez komponent NetworkRequest. Ten komponent zawiera konfiguracje, miejsce docelowe oraz ustawienia żądania, jak również pewną liczbę funkcji pomocnych podczas monitorowania procesu żądania.
W poniższym przykładowym kodzie przedstawiono proces pobierania pliku ze źródła online (w tym przypadku chodzi o obraz). Konsola wyświetla proces pobierania, jak również adres URL pobranego pliku na urządzeniu po zakończeniu żądania.
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
}
}
Właściwość progress zgłoszona przez sygnał onProgressChanged opisuje proces żądania sieciowego w postaci liczby całkowitej z zakresu od 0,0 do 1,0. Ta właściwość analizuje zarówno wysyłającą, jak i odbierającą połowę żądania o równej wadze, co oznacza, że ta wartość rzadko będzie przyrastać w jednolitym tempie. Na przykład dodanie poniższego przykładowego kodu do kodu umieszczonego powyżej spowoduje wyświetlenie paska postępu pobierania obrazu. Jednak ten pasek postępu przesunie się szybko od początku do połowy swojej długości (ponieważ część żądania dotycząca wysyłania jest bardzo mała), a następnie stosunkowo wolno przebędzie resztę drogi.
ProgressBar {
id: progressBar
visible: true
anchors {
left: parent.left
leftMargin: 10
right: parent.right
rightMargin: 10
}
value: networkRequest.progress
}
Nagłówki sieciowe
Nagłówek żądania sieciowego udostępnia adresowi docelowemu informacje identyfikacyjne dotyczące źródła żądania. Obsługa nagłówków jest przeprowadzana w komponencie NetworkRequestHeaders, który za pośrednictwem właściwości headers może zdefiniować alternatywne informacje w tych nagłówkach.
Komponent NetworkRequestHeaders zawiera dwie właściwości, których można użyć do zapisywania w tych obszarach. Właściwość Referrer opisuje źródłowy adres żądania, podczas gdy właściwość userAgent opisuje oprogramowanie użyte do uzyskania dostępu. Domyślnie te właściwości będą zwracać wartości odpowiednie dla aplikacji, ale można zdefiniować je inaczej. W poniższym przykładowym kodzie wysyłane jest żądanie przesłania opisujące siebie jako pochodzące ze strony głównej usługi ArcGIS Online za pośrednictwem przeglądarki 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
}
}