アプリ内のすべてのネットワーク プロセスは、ネットワーク アドレスとアプリ間の情報交換であるネットワーク リクエストによって処理されます。これらのリクエストは、継続的な接続と最新情報の確保、フォームへの応答のフィーチャ サービスへのアップロード、タイル パッケージやジオデータベースのダウンロードなどを実行できるように、アプリとフィーチャ サービス間でシグナリングの交換を行うことができます。
ネットワーク リクエストの作成
ほとんどのネットワーク リクエストは、NetworkRequest コンポーネントによって処理されます。このコンポーネントには、構成、送信先、リクエストの設定と、リクエストのプロセス監視を支援する多くの関数が含まれています。
次のサンプル コードは、オンライン ソースからファイル (この場合は画像) をダウンロードするプロセスを示しています。コンソールには、ダウンロードのプロセスと、リクエストの完了時にデバイス上にダウンロードされるファイルの URL が表示されます。
QtObject {
id: internal
property url folderUrl: AppFramework.userHomeFolder.fileUrl("ArcGIS/Runtime/Data");
}
FileFolder { //Creates FileFolder object to handle filepath
id: fileFolder
url: internal.folderUrl
Component.onCompleted: {
if (!fileFolder.exists) {
fileFolder.makeFolder(internal.folderUrl);
}
}
}
//Downloads an image from the web
NetworkRequest {
id: networkRequest
url: "http://appstudio.arcgis.com/images/index/introview.jpg"
responsePath: fileFolder.path +"/appstudio.jpg"
property url imagePath: responsePath
onReadyStateChanged: {
if (readyState === NetworkRequest.DONE) {
console.log(networkRequest.url, networkRequest.responsePath)
image.source = internal.folderUrl+"/appstudio.jpg";
}
}
onProgressChanged: console.log("progress:", progress)
onError: {
console.log(errorText + ", " + errorCode)
//On failure, don't use the local copy
image.source = ""
}
}
ColumnLayout {
spacing: 20
anchors {
left: app.left
top: app.top
margins: 20
}
Button {
id:download
text: "Download Request (Download Image)"
Layout.margins: 2
Layout.fillWidth: true
onClicked: {
networkRequest.send({f:"json"});
}
}
Button {
id: clear
text: "Clear"
Layout.margins: 2
Layout.fillWidth: true
onClicked: {
image.source = ""
}
}
Image {
id: image
Layout.margins: 10
Layout.preferredWidth: 250
Layout.preferredHeight: 200
}
}
progress プロパティは onProgressChanged シグナルで報告され、0.0 ~ 1.0 の小数値の形式でネットワーク リクエストのプロセスを表します。このプロパティは、リクエストの送信部分と受信部分を同じウェイトと見なします。つまり、この値は、線形な割合で進行することはまれです。たとえば、上記のコードに次のサンプル コードを追加すると、画像のダウンロードの進行状況バーが表示されます。しかし、この進行状況バーは (リクエストの送信部分が非常に小さいため) 空の状態から半分まではすぐに変化し、残りの半分は比較的ゆっくりと進行します。
ProgressBar {
id: progressBar
visible: true
anchors {
left: parent.left
leftMargin: 10
right: parent.right
rightMargin: 10
}
value: networkRequest.progress
}
ネットワーク ヘッダー
ネットワーク リクエストのヘッダーは、リクエストのソースに関する識別情報を送信先アドレスに提供します。NetworkRequestHeaders コンポーネントはこれを処理し、headers プロパティを通じて使用することで、これらのヘッダーに代替情報を定義できます。
NetworkRequestHeaders には、これらの領域への書き込みに使用できるプロパティが 2 つあります。Referrer プロパティはリクエストの元々のアドレスを表し、userAgent プロパティはこれにアクセスするために使用されるソフトウェアを表します。デフォルトでは、これらのプロパティは、アプリを反映した値を返しますが、他の値も定義できます。次のサンプル コードは、Mozilla Firefox を使用して ArcGIS Online ホーム ページから送信されたという形で自身を記述したアップロード リクエストを送信します。
NetworkRequest {
id: uploadRequest
url: "http://sampleserver6.arcgisonline.com/arcgis/rest/services/Wildfire/FeatureServer/1/applyEdits"
method: "POST"
headers.referrer: "https://www.arcgis.com/home/index.html"
headers.userAgent: "Mozilla/5.0"
onReadyStateChanged: {
if ( readyState === NetworkRequest.DONE ) {
result.text = responseText
}
}
onError: result.text = errorText + ", " + errorCode
}
ColumnLayout {
spacing: 20
anchors {
left: app.left
top: app.top
margins: 20
}
Button {
id:upload
text: "Upload Request"
Layout.margins: 2
Layout.fillWidth: true
onClicked: {
uploadRequest.send({adds:"[{\"attributes\":{\"description\":\"Networkrequest Sample\",\"symbolid\":\"13\",\"timestamp\":null},\"geometry\":{\"paths\":[[[-11542803.322978519,3129176.1574580222],[-3547788.0343353897,8625749.168400176],[-5746417.238712249,-3366773.7645645197]]],\"spatialReference\":{\"latestWkid\":3857,\"wkid\":102100}}}]", f:"json"});
}
}
TextArea {
id:result
readOnly: true
Layout.fillWidth: true
Layout.margins: 10
Layout.preferredWidth: 250
Layout.preferredHeight: 75
}
}