خدمة المحتوى

عند نشر نص برمجي كتطبيق ويب، يتم استدعاء دالتَي رد الاتصال الخاصتَين doGet() وdoPost() كلما تم تقديم طلب إلى عنوان URL للنص البرمجي. بدلاً من عرض كائن واجهة مستخدم تم إنشاؤه باستخدام خدمة HTML، يمكن استخدام خدمة المحتوى لعرض محتوى نصي غير أوّلي. يتيح لك ذلك كتابة نصوص برمجية تعمل كـ "خدمات" وتستجيب لطلبات GET وPOST وعرض البيانات الخاصة بمختلف أنواع MIME.

الأساسيات

في ما يلي مثال بسيط على خدمة المحتوى:

function doGet() {
  return ContentService.createTextOutput('Hello, world!');
}

انشر النص البرمجي كتطبيق ويب، باستخدام الخطوات نفسها التي كنت تستخدمها إذا كنت تعرض واجهة مستخدم. عند تقديم طلب GET إلى عنوان URL للنص البرمجي، سيتم عرض النص Hello, world!. وبالإضافة إلى النص العادي، تتيح الخدمة أيضًا عرض محتوى بتنسيق ATOM وCSV وJSON وJavaScript وJSON وRSS وvCard وXML.

عرض خلاصات RSS

لنجرّب طريقة أكثر تعقيدًا، مثل فلترة خلاصة RSS. دائمًا ما تكون القصص المصوّرة XKCD مضحكة، ولكن لا يمكنك الحصول على النكتة الكاملة إلا إذا مرّرت الماوس فوق القصة المصوّرة لرؤية النص البديل. للأسف، لا يمكنك التمرير على متصفح متوافق مع الأجهزة الجوّالة، ولذلك لا يعمل هذا الإجراء.

لِنفترض أنّنا أردنا تعديل الخلاصة كي تظهر الجملة الإضافية مباشرةً في الخلاصة، بدلاً من التمرير إلى الأسفل قليلاً لمشاهدتها. سيعمل ذلك بشكل جيد على جهاز محمول. ها هو الرمز:

function doGet() {
  var feed =  UrlFetchApp.fetch('http://xkcd.com/rss.xml').getContentText();
  feed = feed.replace(
    /(<img.*?alt="(.*?)".*?>)/g,
    '$1' + new Array(10).join('<br />') + '$2');
  return ContentService.createTextOutput(feed)
    .setMimeType(ContentService.MimeType.RSS);
}

قد يبدو ذلك صعبًا، لكنه ينقسم إلى أجزاء بسيطة. نستخدم خدمة جلب عنوان URL لجلب خلاصة RSS الأصلية XKCD. ثم نستخدم تعبير JavaScript عاديًا لإجراء عمليات الاستبدال التي نحتاجها. وأخيرًا، ندمج الخلاصة المعدّلة في كائن TextOutput ونضبط نوع MIME على RSS.

لرؤية هذا الأمر عمليًا، انشر النص البرمجي كتطبيق ويب، مع الحرص على السماح بالوصول بدون كشف هويتك (لأنّ قارئ RSS سينتقل إليه كمستخدم مجهول). أضِف بعد ذلك عنوان URL الخاص بالخدمة (وليس خلاصة RSS الأصلية) إلى قارئ خلاصة RSS أو انتقِل إليها مباشرةً في متصفّح ويب. أكملت هذه الخطوة.

عرض JSON من النصوص البرمجية

كيف يمكننا الاستفادة أيضًا من خدمة المحتوى؟ وماذا عن عرض JSON على نصوص برمجية أخرى أو مواقع ويب وخدمات أخرى! إليك نص برمجي بسيط ينفِّذ خدمة يمكن لأي شخص استخدامها لمعرفة ما إذا كانت خانة التقويم مفتوحة في وقت محدّد.

function doGet(request) {
  var events = CalendarApp.getEvents(
    new Date(Number(request.parameters.start) * 1000),
    new Date(Number(request.parameters.end) * 1000));
  var result = {
    available: events.length == 0
  };
  return ContentService.createTextOutput(JSON.stringify(result))
    .setMimeType(ContentService.MimeType.JSON);
}

كما في السابق، انشر هذا التطبيق كتطبيق ويب مجهول الهوية لإنجاحه. في هذه الحالة، يمكن لمستخدمي خدمتك الجديدة استخدامها من خلال إضافة معلمات عنوان URL إلى نهاية عنوان URL للخدمة. توفّر المعلمتان start وend نطاقًا زمنيًا يجب التحقّق منهما، والذي تم تحديده في حقبة يونكس القياسية.

curl -L URL_OF_YOUR_SCRIPT?start=1325437200&end=1325439000

ستعرض الخدمة ملف JSON الذي يبلغ عما إذا كان هناك أي شيء في التقويم في هذا النطاق.

{"available":true}

عرض JSONP في صفحات الويب

مع تغيير بسيط، يمكن أن تتحوّل خدمة JSON إلى JSONP، ما يعني أنّه يمكن استدعائها من JavaScript في متصفّح. في ما يلي النص البرمجي الجديد:

function doGet(request) {
  var events = CalendarApp.getEvents(
    new Date(Number(request.parameters.start) * 1000),
    new Date(Number(request.parameters.end) * 1000));
  var result = {
    available: events.length == 0
  };
  return ContentService.createTextOutput(
    request.parameters.prefix + '(' + JSON.stringify(result) + ')')
    .setMimeType(ContentService.MimeType.JAVASCRIPT);
}

لطلب هذه الخدمة من متصفّح، أنشئ علامة نص برمجي تكون سمة src الخاصة بها هي عنوان URL للخدمة، مع مَعلمة إضافية باسم prefix. وهذا هو اسم الدالة في JavaScript من جهة العميل والتي سيتم استدعاؤها بالقيمة التي تعرضها الخدمة.

<script src="URL_OF_YOUR_SCRIPT?start=1325437200&end=1325439000&prefix=alert"></script>

وسيعرض هذا المثال مربّع رسالة في المتصفّح يتضمّن نتيجة الخدمة، لأنّنا نحدّد دالة alert() المضمَّنة في المتصفّح كبادئة. سيبدو رمز JavaScript الذي يتم عرضه على النحو التالي:

alert({"available":true})

عمليات إعادة التوجيه

لأسباب تتعلق بالأمان، لا يتم عرض المحتوى الذي تعرضه خدمة المحتوى من script.google.com، ولكن تتم إعادة توجيهه إلى عنوان URL لمرة واحدة على script.googleusercontent.com. وهذا يعني أنه إذا كنت تستخدم خدمة المحتوى لعرض البيانات إلى تطبيق آخر، يجب التأكد من ضبط عميل HTTP لمتابعة عمليات إعادة التوجيه. على سبيل المثال، في أداة سطر الأوامر cURL، أضِف العلامة -L. راجِع وثائق عميل HTTP للحصول على مزيد من المعلومات عن كيفية تفعيل هذا السلوك.