Работа с сетевыми сервисами

У компонента NetworkRequest есть возможность создавать вызовы ArcGIS REST API к ArcGIS Online. Для этого компонент встраивает объекты из класса XMLHttpRequest в JavaScript и из инструмента командной строки cURL (URL клиента). Это позволяет перенести код из веб-приложения JavaScript в нативное приложение QML.

Перенос из XMLHttpRequest в NetworkRequest

В следующих примерах кода показана аналогичная функциональность между JavaScript и AppStudio AppFramework. Это можно исопльзовать как руководство при переносе кода из JavaScript в QML.

Этот пример кода использует XMLHttpRequest в JavaScript для выполнения сетевого запроса.

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

Этот пример кода использует NetworkRequest в AppFramework для выполнения аналогичного сетевого запроса.

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

Пересчет ReadyState

Свойство readyState заполняется в ходе пересчета целыми числами, которые представляют собой потенциальные значения свойств. Вы можете использовать целочисленное значение, статус JavaScript или статус NetworkRequest в своем приложении без изменения поведения, это упростит перенос с XMLHttpRequest.

Целое значениеСтатус JavaScriptNetworkRequest

0

UNSENT

ReadyStateUninitialized

1

OPENED

ReadyStateInitialized

2

HEADERS_RECEIVED

ReadyStateSending

3

LOADING

ReadyStateProcessing

4

ГОТОВО

ReadyStateComplete

Управление файлами

Ключевое различие между веб-приложением и нативным приложением заключается в том, что у веб-приложений нет возможности доступа к вашей файловой системе, а у нативных приложений она есть. Это различие отражается в том, что XMLHttpRequest не может получить доступ к файлам, а NetworkRequest может. Доступ к файлам, которые необходимы в веб-приложении, должен выполняться с помощью cURL, отличного от JavaScript.

Чтобы загрузить файл с помощью cURL, необходимо выполнить следующее:

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 содержит свойство uploadPrefix для управления символами, которые должны быть перед именем файла. Значение этого свойства по умолчанию - @, что позволяет сохранить совместимость с cURL. Пример кода ниже показывает аналогичное поведение, воспроизведенное с помощью 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"
        } );
    }
}

Объект JSON, направленный в метод send, является объектом JavaScript, который содержит карту словарных ключевых значений. Свойство method в NetworkRequest описывает природу сетевого запроса. Если оставить это свойство пустым или без определения, оно по умолчанию выполнит запрос GET. Если загрузка файла необходима, свойство method должно быть задано как POST.

Тип ресурсов по умолчанию

Для упрощения запросов к ArcGIS REST API, NetworkRequest по умолчанию отправляет заголовок Content-Type на application/x-www-form-urlencoded. Это необходимо при использовании ArcGIS Online REST API. Это Content-Type также позволит работать с большинством других веб-сайтов. Однако для некоторых сайтов, например, Amazon Web Services, может потребоваться очистить это свойство:

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