Praca z usługami sieciowymi

Komponent NetworkRequest może wykonywać wywołania interfejsu ArcGIS REST API do usługi ArcGIS Online. W tym celu komponent obejmuje funkcje z klasy XMLHttpRequest w języku JavaScript oraz narzędzie wiersza polecenia cURL (client URL). Umożliwia to migrację kodu z aplikacji internetowej w języku JavaScript do aplikacji natywnej QML.

Migracja z komponentu XMLHttpRequest do NetworkRequest

Poniższe przykłady kodu przedstawiają tę samą funkcjonalność w języku JavaScript oraz module AppStudio AppFramework. Mogą one posłużyć jako wskazówki podczas migrowania kodu z języka JavaScript do QML.

W tym przykładzie kodu użyto komponentu XMLHttpRequest w języku JavaScript w celu wykonania żądania sieciowego.

var req = new XMLHttpRequest();
var url = "http://www.arcgis.com/sharing/rest?f=json"
req.open("GET", url, true);
req.onreadystatechange = function() {
    console.log("readyState: ", req.readyState);
    if (req.readyState !== 4) return;
    if (req.status !== 200) return;
    console.log("responseText: ", req.responseText);
}
req.send();

W tym przykładzie kodu użyto komponentu NetworkRequest w module AppFramework w celu wykonania tego samego żądania sieciowego.

NetworkRequest {
    id: req
    url: "http://www.arcgis.com/sharing/rest?f=json"
    onReadyStateChanged: {
        console.log("readyState: ", readyState);
        if (readyState !== 4) return;
        if (status !== 200) return;
        console.log("responseText: ", responseText);
    }
}
function test() {
    req.send();
}

Wyliczenie ReadyState

Właściwość readyState jest zapełniana przez wyliczenie, przy czym liczby całkowite reprezentują możliwe wartości właściwości. W aplikacji możesz użyć wartości liczby całkowitej, stanu JavaScript lub stanu NetworkRequest bez zmian w zachowaniu, aby ułatwić migrację z komponentu XMLHttpRequest.

Wartość liczby całkowitejStan JavaScriptNetworkRequest

0

UNSENT

ReadyStateUninitialized

1

OPENED

ReadyStateInitialized

2

HEADERS_RECEIVED

ReadyStateSending

3

WCZYTYWANIE

ReadyStateProcessing

4

GOTOWE

ReadyStateComplete

Obsługa plików

Kluczowa różnica między aplikacją internetową i natywną jest taka, że aplikacje internetowe nie mogą uzyskiwać dostępu do systemu plików, a aplikacje natywne mogą. Ta różnica jest odzwierciedlona przez fakt, że komponent XMLHttpRequest nie może uzyskiwać dostępu do plików, a komponent NetworkRequest może. Żądania dostępu do plików w aplikacji internetowej musiałyby być wykonywane za pomocą narzędzia cURL, a nie języka JavaScript.

Aby przesłać plik za pomocą narzędzia cURL, konieczne byłoby wykonanie następujących czynności:

curl \
    -F title="My Code Sample"
    -F type="Code Sample"
    -F tags="Code Sample"
    -F file="@CodeSample.zip"
    -F token="${ARCGIS_ONLINE_TOKEN}"
    http://http://www.arcgis.com/sharing/rest/content/users/jsmith/addItem

Komponent NetworkRequest zawiera właściwość uploadPrefix na potrzeby obsługi znaków niezbędnych przed nazwą pliku. Wartość domyślna tej właściwości to @, aby zachować zgodność z narzędziem cURL. Poniższy przykład kodu demonstruje to samo zachowanie osiągnięte przy użyciu komponentu NetworkRequest.

property string user: "jsmith"
property string itemTitle: "My Code Sample"
property string itemType: "Code Sample"
property string itemTags: "Code, Sample"
property string itemFile: "CodeSample.zip"
property string token // ARCGIS_ONLINE_TOKEN
NetworkRequest {
    id: req    url: "http://www.arcgis.com/sharing/rest/content/users/%1/addItem".arg(user)
	function submit() {
        send( {
            "title": itemTitle,            "type": itemType,            "tags": itemTags,            "file": uploadPrefix + itemFile,            "token": token,            "f": "json"
        } );
    }
}

Obiekt JSON przekazany do metody send, to obiekt JavaScript zawierający mapę słownika typu klucz-wartość. Właściwość method w komponencie NetworkRequest opisuje charakter żądania sieciowego. Jeśli ta właściwość pozostanie pusta lub niezdefiniowana, domyślnie będzie używane żądanie GET. Jeśli wymagane jest przesłanie pliku, właściwość method musi być skonfigurowana na wartość POST.

Domyślny nagłówek Content-Type

Aby uprościć żądania do interfejsu ArcGIS REST API, komponent NetworkRequest domyślnie używa nagłówka Content-Type o wartości application/x-www-form-urlencoded. Jest on wymagany podczas korzystania z interfejsu ArcGIS Online REST API. Ten nagłówek Content-Type będzie także działać w przypadku większości innych witryn. Jednak w przypadku niektórych witryn, takich jak Amazon Web Services, może być konieczne wyczyszczenie tego ustawienia:

networkRequest.headers["Content-Type"] = "";