Żądania sieciowe

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