طلبات الشبكة

يتم معالجة كل عمليات الشبكة في التطبيق بواسطة طلبات الشبكة، وهي تبادل للمعلومات بين عنوان شبكة وتطبيق. ويمكن تبادل هذه الطلبات بالإشارة بين التطبيق وخدمة المعلم لضمان اتصال مستمر ومعلومات حديثة أو تحميل استجابات النموذج إلى خدمة معالم مركزية أو تنزيل حزمة تجانب أو قاعدة بيانات جغرافية للتجانب، كأمثلة.

إنشاء طلب شبكة

يتم معالجة معظم طلب الشبكة بواسطة مكون 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 خاصيتين يمكن استخدامهما للكتابة في هذه المناطق. تصف خاصية Referrer عنوان مصدر الطلب، في حين أن خاصية userAgent تصف البرنامج المستخدم للوصول إليه. وافتراضيًا، ستقوم هذه الخصائص بإرجاع القيم الانعكاسية للتطبيق، ولكن يمكن تعريفها بشكل آخر. يُرسل كود العينة التالية طلب تحميل يصف نفسه على أنه قادم من صفحة ArcGIS Online الرئيسية باستخدام Mozilla Firefox.

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
    }
}