ネットワーク リクエスト

アプリ内のすべてのネットワーク プロセスは、ネットワーク アドレスとアプリ間の情報交換であるネットワーク リクエストによって処理されます。これらのリクエストは、継続的な接続と最新情報の確保、フォームへの応答のフィーチャ サービスへのアップロード、タイル パッケージやジオデータベースのダウンロードなどを実行できるように、アプリとフィーチャ サービス間でシグナリングの交換を行うことができます。

ネットワーク リクエストの作成

ほとんどのネットワーク リクエストは、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
    }
}