Lavorare con servizi di rete

Il componente NetworkRequest ha la possibilità di effettuare chiamate ArcGIS REST API ad ArcGIS Online. A tal fine, il componente incorpora funzionalità dalla classe XMLHttpRequest in JavaScript e lo strumento da riga di comando cURL (URL client). Ciò consente la migrazione del codice da un'app Web JavaScript ad un'app nativa QML.

Migrare da XMLHttpRequest a NetworkRequest

I seguenti codici di esempio dimostrano la stessa funzionalità su JavaScript e su AppStudio AppFramework. Ciò può essere utile come guida durante la migrazione del codice da JavaScript a QML.

Questo codice di esempio utilizza XMLHttpRequest in JavaScript per eseguire una richiesta di rete.

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

Questo codice di esempio utilizza NetworkRequest in AppFramework per eseguire una richiesta di rete.

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

Enumerazione ReadyState

La proprietà readyState viene immessa da un'enumerazione, con numeri interi che rappresentano valori di proprietà potenziali. È possibile utilizzare il valore intero, lo stato JavaScript o lo stato NetworkRequest nell’app senza modificare il comportamento, per consentire una migrazione più semplice da XMLHttpRequest.

Valore interoStato JavaScriptNetworkRequest

0

NON INVIATO

ReadyStateUninitialized

1

APERTO

ReadyStateInitialized

2

INTESTAZIONI_RICEVUTE

ReadyStateSending

3

CARICAMENTO IN CORSO

ReadyStateProcessing

4

FINE

ReadyStateComplete

Gestione file

Una differenza fondamentale tra un'app Web e un'app nativa è che le app Web non hanno la possibilità di accedere al file system, al contrario delle app native. Questa differenza si riflette nel fatto che XMLHttpRequest non può accedere ai file, al contrario di NetworkRequest. Le richieste di accesso ai file in un'app Web devono essere eseguite utilizzando cURL, piuttosto che JavaScript.

Per caricare un file usando cURL, attenersi alla procedura seguente:

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 contiene una proprietà uploadPrefix per gestire i caratteri necessari prima di un nome file. Il valore predefinito di questa proprietà è @, per mantenere la compatibilità con cURL. Il seguente codice di esempio mostra lo stesso comportamento, replicato utilizzando 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'oggetto JSON passato al metodo di invio è un oggetto JavaScript contenente una mappa del dizionario del valore chiave. La proprietà method in NetworkRequest descrive la natura della richiesta di rete. Se questa proprietà viene lasciata vuota o indefinita, passa per impostazione predefinita ad una richiesta GET. Se è richiesto il caricamento di un file, la proprietà method deve essere impostata su POST.

Tipo predefinito di contenuto

Per semplificare le richieste ad ArcGIS REST API, NetworkRequest porta per impostazione predefinita l'intestazione Content-Type su application/x-www-form-urlencoded. È richiesto quando si utilizza ArcGIS Online REST API. Questo Content-Type funziona anche per la maggior parte degli altri siti web. Tuttavia, per alcuni siti Web specifici, come Amazon Web Services, potrebbe essere necessario cancellare questa impostazione:

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