Arbeiten mit Netzwerk-Services

Die NetworkRequest-Komponente kann ArcGIS REST API-Aufrufe für ArcGIS Online ausführen. Zu diesem Zweck enthält die Komponente Funktionen der Klasse "XMLHttpRequest" in JavaScript und das Befehlszeilendienstprogramm cURL (Client-URL). Dies ermöglicht die Migration von Code aus einer JavaScript-Web-App zu einer nativen QML-App.

Migrieren von "XMLHttpRequest" zu "NetworkRequest"

In den folgenden Codebeispielen wird die gleiche Funktionalität in JavaScript und AppStudio AppFramework veranschaulicht. Sie können dies als Orientierungshilfe verwenden, wenn Sie Code von JavaScript zu QML migrieren.

In diesem Codebeispiel wird mit "XMLHttpRequest" in JavaScript eine Netzwerkanforderung durchgeführt.

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();

In diesem Codebeispiel wird die gleiche Netzwerkanforderung mit "NetworkRequest" in AppFramework durchgeführt.

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();
}

Aufzählung "ReadyState"

Die Eigenschaft readyState wird durch eine Aufzählung aufgefüllt, wobei ganze Zahlen potenzielle Eigenschaftswerte darstellen. Sie können den ganzzahligen Wert, den JavaScript-Status oder den NetworkRequest-Status in der App ohne eine Änderung des Verhaltens verwenden, um die Migration von "XMLHttpRequest" zu erleichtern.

Integer valueJavaScript-StatusNetworkRequest

0

UNSENT

ReadyStateUninitialized

1

OPENED

ReadyStateInitialized

2

HEADERS_RECEIVED

ReadyStateSending

3

WIRD GELADEN…

ReadyStateProcessing

4

FERTIG

ReadyStateComplete

Dateiverarbeitung

Ein wichtiger Unterschied zwischen Web-Apps und nativen Apps besteht darin, dass Web-Apps im Gegensatz zu nativen Apps keinen Zugriff auf das Dateisystem haben. Somit kann mit "NetworkRequest" auf Dateien zugegriffen werden, jedoch nicht mit "XMLHttpRequest". In einer Web-App müssen Dateizugriffsanforderungen mit cURL statt mit JavaScript erfolgen.

Um mit cURL eine Datei hochzuladen, müssen Sie wie folgt vorgehen:

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

"NetworkRequest" enthält die Eigenschaft uploadPrefix zum Behandeln der Zeichen, die vor einem Dateinamen erforderlich sind. Damit die Kompatibilität mit cURL gewahrt bleibt, lautet der Standardwert dieser Eigenschaft "@". Im folgenden Codebeispiel wird das gleiche Verhalten unter Verwendung von "NetworkRequest" veranschaulicht.

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"
        } );
    }
}

Das an die Methode "send()" übergebene JSON-Objekt ist ein JavaScript-Objekt, das ein Wörterbuch mit Schlüssel-Wert-Paaren enthält. Die Eigenschaft method in "NetworkRequest" beschreibt die Art der Netzwerkanforderung. Wenn diese Eigenschaft leer oder nicht definiert ist, wird sie standardmäßig auf eine GET-Anforderung festgelegt. Wenn ein Datei-Upload erforderlich ist, muss die Eigenschaft method auf POST festgelegt werden.

Standardinhaltstyp

Um Anforderungen an ArcGIS REST API zu vereinfachen, lautet in "NetworkRequest" der Content-Type-Header standardmäßig application/x-www-form-urlencoded. Dies ist bei Verwendung der ArcGIS Online-REST-API erforderlich. Content-Type kann auch für die meisten anderen Websites verwendet werden. Für einige besondere Websites, z. B. Amazon Web Services, müssen Sie die vorgenommenen Einstellung möglicherweise zurücksetzen:

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