Trabajar con servicios de redes

El componente NetworkRequest tiene la capacidad de invocar API REST de ArcGIS en ArcGIS Online. Para ello, el componente incorpora característica de la clase XMLHttpRequest de JavaScript y la herramienta de línea de comandos de cURL (URL de cliente). Permite migrar código desde una aplicación web de JavaScript a una aplicación nativa de QML.

Migrar de XMLHttpRequest a NetworkRequest

Las siguientes muestras de código presentan la misma funcionalidad tanto en JavaScript como en AppStudio AppFramework. Puede ser útil como guía para la migración de código de JavaScript a QML.

Esta muestra de código utiliza XMLHttpRequest en JavaScript para realizar una solicitud de red.

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

Esta muestra de código utiliza NetworkRequest en el AppFramework para realizar la misma solicitud de red.

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

Enumeración ReadyState

La propiedad readyState se rellena por enumeración, con enteros que representan valores de propiedad potenciales. Puede utilizar el valor entero, el estado de JavaScript o el de NetworkRequest en su aplicación sin experimentar cambios en el comportamiento, para permitir una migración más sencilla desde XMLHttpRequest.

Integer valueEstado de JavaScriptNetworkRequest

0

NO ENVIADO

ReadyStateUninitialized

1

ABIERTO

ReadyStateInitialized

2

HEADERS_RECEIVED

ReadyStateSending

3

CARGANDO

ReadyStateProcessing

4

HECHO

ReadyStateComplete

Manejo de archivos

Una diferencia clave entre una aplicación web y una aplicación nativa es que las aplicaciones web no tiene la capacidad de acceder a su sistema de archivos, mientras que las aplicaciones nativas sí. Esta diferencia se refleja en que XMLHttpRequest no puede acceder a archivos, pero NetworkRequest sí. Las solicitudes de acceso a archivos en una aplicación web necesitarían realizarse con cURL, en lugar de con JavaScript.

Para cargar un archivo con cURL, deberá realizar lo siguiente:

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 propiedad uploadPrefix para manejar los caracteres necesarios antes del nombre de archivo. El valor predeterminado de esta propiedad es @, para mantener la compatibilidad con cURL. La siguiente muestra de código presenta el mismo comportamiento, replicado con 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"
        } );
    }
}

El objeto JSON pasado al método de envío es un objeto de JavaScript que contiene un mapa de diccionario con valores clave. La propiedad method de NetworkRequest presenta la naturaleza de la solicitud de red. Si esta propiedad se deja en blanco o sin definir, adquirirá el valor predeterminado de una solicitud GET. Si se requiere la carga de un archivo, la propiedad method debe definirse en POST.

Tipo de contenido predeterminado

Para simplificar las solicitudes a API REST de ArcGIS, NetworkRequest define por defecto el encabezado Content-Type como application/x-www-form-urlencoded. Se requiere cuando se utiliza la API REST de ArcGIS Online. También Content-Type funcionará para casi cualquier sitio web. Sin embargo, para algunos sitios web específicos, por ejemplo, Amazon Web Services, puede que deba borrar estos ajustes:

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