Utiliser des services de mise en réseau

Le composant NetworkRequest permet d’effectuer des appels ArcGIS REST API vers ArcGIS Online. Pour cela, le composant intègre des fonctions de la classe XMLHttpRequest dans JavaScript, et l’outil de ligne de commande cURL (client URL). Ceci permet de migrer le code d’une application web JavaScript vers une application native QML.

Migrer de XMLHttpRequest vers NetworkRequest

Les exemples de code suivants montrent la même fonctionnalité sous JavaScript et AppStudio AppFramework. Ceci peut vous servir de guide pour migrer le code depuis JavaScript vers QML.

Cet exemple de code utilise XMLHttpRequest sous JavaScript pour effectuer une requête réseau.

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

Cet exemple de code utilise NetworkRequest sous AppFramework pour effectuer la même requête réseau.

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

Énumération ReadyState

La propriété readyState est renseignée par une énumération, utilisant des entiers pour représenter les valeurs de propriété potentielles. Vous pouvez utiliser la valeur entière, l’état JavaScript, ou l’état NetworkRequest dans votre application sans aucun changement de comportement, pour faciliter la migration depuis XMLHttpRequest.

Valeur entièreÉtat JavaScriptNetworkRequest

0

NON ENVOYÉ

ReadyStateUninitialized

1

OUVERT

ReadyStateInitialized

2

HEADERS_RECEIVED

ReadyStateSending

3

CHARGEMENT

ReadyStateProcessing

4

TERMINÉ

ReadyStateComplete

Gestion des fichiers

Une différence fondamentale entre une application web et une application native est que les applications web ne peuvent pas accéder à votre système de fichiers, au contraire des applications natives. Cette différence se traduit par le fait que XMLHttpRequest ne peut pas accéder aux fichiers, à l’inverse de NetworkRequest. Il conviendrait d’utiliser cURL, plutôt que JavaScript, pour les demandes d’accès aux fichiers dans une application web.

Pour télécharger un fichier à l'aide de cURL, procédez comme suit :

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 contient une propriété uploadPrefix pour gérer les caractères requis avant un nom de fichier. La valeur par défaut de cette propriété est @, afin de conserver la compatibilité avec cURL. L’exemple de code suivant montre le même comportement, répliqué en utilisant 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"
        } );
    }
}

L’objet JSON transmis à la méthode send (envoyer) est un objet JavaScript contenant une carte de dictionnaire de valeur clé. La propriété method dans NetworkRequest décrit la nature de la requête réseau. Si cette propriété n’est pas renseignée ou non définie, une requête GET sera utilisée par défaut. Si un téléchargement de fichiers est requis, la propriété method doit être définie sur POST.

Type de contenu par défaut

Pour simplifier les requêtes transmises à ArcGIS REST API, NetworkRequest définit par défaut l’en-tête Content-Type sur application/x-www-form-urlencoded. Ceci est requis pour l’utilisation de ArcGIS Online REST API. Ce Content-Type fonctionnera également avec la plupart des autres sites web. Toutefois, pour certains sites web spécifiques, tels que Amazon Web Services, vous devrez peut-être désactiver ce paramètre :

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