NetworkRequest コンポーネントは、ArcGIS Online に対して ArcGIS REST API 呼び出しを行うことができます。このため、このコンポーネントには、JavaScript の XMLHttpRequest クラスの機能および cURL (クライアント URL) コマンド ライン ツールが組み込まれています。これにより、JavaScript Web アプリから QML ネイティブ アプリへのコードの移行が可能になります。
XMLHttpRequest から NetworkRequest への移行
次のサンプル コードは、JavaScript と AppStudio AppFramework の両方で同一の機能を示しています。これは、JavaScript から QML へコードを移行するときのガイドとして役立ちます。
このサンプル コードでは、JavaScript の XMLHttpRequest を使用して、ネットワーク リクエストを実行します。
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();
このサンプル コードでは、AppFramework の NetworkRequest を使用して、同じネットワーク リクエストを実行します。
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 プロパティには列挙が設定され、可能性のあるプロパティ値を表す整数が示されます。XMLHttpRequest からの移行をしやすくするために、整数値、JavaScript state、または NetworkRequest state のいずれかをアプリで使用でき、この場合、動作には変更はありません。
整数値 | JavaScript state | NetworkRequest |
---|---|---|
0 | UNSENT | ReadyStateUninitialized |
1 | OPENED | ReadyStateInitialized |
2 | HEADERS_RECEIVED | ReadyStateSending |
3 | 読み込み中 | ReadyStateProcessing |
4 | 完了 | ReadyStateComplete |
ファイル処理
Web アプリとネイティブ アプリの主な違いは、Web アプリはファイル システムにアクセスできないのに対して、ネイティブ アプリはアクセスできることです。この違いは、XMLHttpRequest がファイルにアクセスできないのに対して、NetworkRequest がアクセスできる点に反映されています。Web アプリでファイル アクセス リクエストを実行するには、JavaScript ではなく cURL を使用する必要があります。
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"
} );
}
}
send メソッドに渡される JSON オブジェクトは、キーと値のディクショナリ マップが格納される JavaScript オブジェクトです。NetworkRequest の method プロパティはネットワーク リクエストの特性を表します。このプロパティが空白のままか、未定義の場合は、デフォルトで GET リクエストに設定されます。ファイルのアップロードが必要な場合、method プロパティは [POST] に設定されなければなりません。
デフォルトの Content-Type
ArcGIS REST API へのリクエストを簡略化するために、NetworkRequest では、Content-Type ヘッダーがデフォルトで application/x-www-form-urlencoded に設定されます。これは、ArcGIS Online REST API の使用時に必要とされます。また、この Content-Type は他の大部分の Web サイトに対しても使用できます。ただし、Amazon Web Services などの一部の特定の Web サイトについては、この設定をクリアする必要がある場合もあります。
networkRequest.headers["Content-Type"] = "";