Trabalhar com servições de rede

O componente NetworkRequest tem a habilidade de criar solicitações do ArcGIS REST API no ArcGIS Online. Para fazer isto, o componente incorpora recursos da classe XMLHttpRequest no JavaScript e ferramenta da linha de comando cURL (URL do cliente). Isto permite a migração de código de um aplicativo JavaScript da web para um aplicativo QML nativo.

Migrar do XMLHttpRequest para NetworkRequest

As seguintes amostras de código demonstram a mesma funcionalidade no JavaScript e no AppFramework do AppStudio. Isto pode ser útil como um guia ao migrar o código do JavaScript para QML.

Esta amostra de código utiliza XMLHttpRequest no JavaScript para executar uma solicitação de rede.

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 amostra de código utiliza NetworkRequest no AppFramework para executar a mesma solicitação de rede.

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

Enumeração de ReadyState

A propriedade readyState é preenchida por uma enumeração, com números inteiros representando potenciais valores de propriedades. Você pode utilizar o valor inteiro, o estado do JavaScript ou o estado do NetworkRequest no seu aplicativo sem alteração de comportamento, para facilitar a migração do XMLHttpRequest.

Valor inteiroEstado do JavaScriptNetworkRequest

0

NÃO ENVIADO

ReadyStateUninitialized

1

ABERTO

ReadyStateInitialized

2

CABEÇALHOS_RECEBIDOS

ReadyStateSending

3

CARREGANDO

ReadyStateProcessing

4

CONCLUIR

ReadyStateComplete

Identificação de arquivo

A principal diferença entre um aplicativo da web e um aplicativo nativo é que os aplicativos da web não têm a capacidade de acessar o sistema de arquivos, enquanto aplicativos nativos sim. Esta diferença é refletida no XMLHttpRequest que não pode acessar arquivos, mas o NetworkRequest sim. As solicitações de acesso aos arquivos em um aplicativo da web precisam ser feitas utilizando cURL, ao invés do JavaScript.

Para carregar um arquivo utilizando cURL, você terá que fazer o seguinte:

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 contém uma propriedade uploadPrefix para manipular caracteres necessários antes de um nome de arquivo. O valor padrão desta propriedade é @, para manter a compatibilidade com cURL. A seguinte amostra de código demonstra o mesmo comportamento, replicado utilizando o 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"
        } );
    }
}

O objeto JSON passado para o método de envio é um objeto JavaScript que contém um mapa de dicionário de valor-chave. A propriedade method no NetworkRequest descreve a natureza da solicitação de rede. Se esta propriedade for deixada em branco ou indefinida, será padronizada para uma solicitação GET. Se uma transferência de arquivo for exigida, a propriedade method deve ser configurada para POST.

Tipo de Conteúdo Padrão

Para simplificar as solicitações no ArcGIS REST API, o NetworkRequest padroniza o cabeçalho de Content-Type para application/x-www-form-urlencoded. Isto é exigido ao utilizar o REST API no ArcGIS Online. Este Content-Type também funcionará para a maioria dos outros sites. No entanto, para alguns sites da web específicos, como Amazon Web Services, talvez seja necessário apagar esta configuração:

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