تصحيح أخطاء عملاء Google Data API: استكشاف عدد الزيارات من داخل برنامجك

جيفري سكودر، فريق Google Data APIs
يونيو 2007

مقدمة

في بعض الأحيان، لا غنى عن معرفة ما يتم إرساله عبر الشبكة. ويصدق ذلك بشكل خاص عند كتابة برامج تستخدم خدمات الويب، مثل Google Data APIs، حيث تتضمّن العديد من العمليات تقديم طلبات HTTP. عندما لا ينجح أي شيء آخر، يمكنك التأكّد من أنّ برنامجك ينفّذ ما تتوقّعه من خلال الاطّلاع على وحدات البايت المرسَلة والمستلَمة الفعلية. تتضمّن العديد من مكتبات البرامج الخاصة بواجهات Google Data APIs وضع تصحيح الأخطاء الذي يعرض عدد الزيارات عبر HTTP. ويكون هذا الإجراء مفيدًا بشكل خاص عندما لا يمكنك استخدام أداة تحليل حزم البيانات مثل WireShark أو Fiddler.

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

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

في هذه المقالة، كتبتُ نموذجًا لرمز برمجي تشخيصي بثلاث لغات باستخدام مكتبات برامج Google Data API لكل من Java و.NET وPython. في كل مثال، أفعّل تسجيل الدخول أو تصحيح الأخطاء، وأصادق على الحساب باستخدام تسجيل الدخول للعميل، ثم أحصل على قائمة بجداول بيانات Google وأطبع عناوينها.

Java

يمكنك استخدام فئات java.util.logging لضبط مستويات التسجيل (وبالتالي عرض بيانات الزيارات) لبعض العناصر الرئيسية في مكتبة البرامج. في المثال أدناه، اخترت الاطّلاع على عناوين HTTP وأنشطة محلّل XML للحصول على عرض كامل لما يتم نقله عبر الشبكة.

تحتوي مكتبة برامج Java الخاصة ببيانات Google على فئات منفصلة للتعامل مع طلبات HTTP وتحليل XML، لذا يجب إنشاء عنصرين من عناصر Logger، أحدهما لكل فئة: يتعامل com.google.gdata.client.http.HttpGDataRequest مع زيارات HTTP، بينما يتولى com.google.gdata.util.XmlParser تحليل XML.

ستسجّل مثيلات أداة التسجيل الأنشطة الخاصة بـ HttpGDataRequest وXmlParser، ويمكنك التحكّم في مستوى تفاصيل ناتج كل أداة تسجيل. في هذا العرض التوضيحي، اخترت عرض جميع الأحداث التي تنتجها الكائنان HttpGDataRequest وXmlParser.

بعد إنشاء وإعداد أدوات تسجيل الأحداث، يجب أن أحدّد لها الإجراءات التي يجب اتّخاذها عند تلقّي حدث من فئاتها. في الوقت الحالي، أريد كتابة جميع معلومات التسجيل في وحدة التحكّم، لذا سأُنشئ ConsoleHandler وأضيفه إلى كل من مسجّلي الأحداث.

في ما يلي نموذج الرمز البرمجي:

import com.google.gdata.client.spreadsheet.*;
import com.google.gdata.data.spreadsheet.*;
import com.google.gdata.util.*;
import java.io.*;
import java.net.URL;
import java.util.*;
import java.util.logging.*;

public class PrintSpreadsheetsWithLogging {
   
   
public static void main(String [] args) throws AuthenticationException,
                                                   
ServiceException, IOException {
       
// Configure the logging mechanisms.
       
Logger httpLogger = Logger.getLogger("com.google.gdata.client.http.HttpGDataRequest");
        httpLogger
.setLevel(Level.ALL);
       
Logger xmlLogger = Logger.getLogger("com.google.gdata.util.XmlParser");
        xmlLogger
.setLevel(Level.ALL);
       
// Create a log handler which prints all log events to the console.
       
ConsoleHandler logHandler = new ConsoleHandler();
        logHandler
.setLevel(Level.ALL);
        httpLogger
.addHandler(logHandler);
        xmlLogger
.addHandler (logHandler);
       
       
SpreadsheetService service = new SpreadsheetService("testing-loggingExampleApp-1");
        service
.setUserCredentials(email, password);
     
       
// Get a list of your spreadsheets.
        URL metafeedUrl
= new URL("http://spreadsheets.google.com/feeds/spreadsheets/private/full ");
       
SpreadsheetFeed feed = service.getFeed(metafeedUrl, SpreadsheetFeed.class);
     
       
// Print the title of each spreadsheet.
       
List spreadsheets = feed.getEntries();
       
for (int i = 0; i < spreadsheets.size(); i++) {
         
SpreadsheetEntry entry = (SpreadsheetEntry)spreadsheets.get(i);
         
System.out.println("\t" + entry.getTitle().getPlainText());
       
}
   
}
}

عند تشغيل هذا البرنامج، سيظهر لك ما يلي على وحدة التحكّم (لقد أزلت بعض الأجزاء الأقل إثارة للاهتمام):

Jun 7, 2007 10:24:50 AM ...HttpGDataRequest setPrivateHeader
FINER: Authorization: <Not Logged>
Jun 7, 2007 10:24:50 AM ...HttpGDataRequest setHeader
FINER: User-Agent: ...
...
Jun 7, 2007 10:25:20 AM ...HttpGDataRequest execute
FINE: 200 OK
Jun 7, 2007 10:25:20 AM ...HttpGDataRequest execute
FINER: Date: Thu, 07 Jun 2007 17:25:24 GMT
Jun 7, 2007 10:25:20 AM ...HttpGDataRequest execute
FINER: null: HTTP/1.1 200 OK
Jun 7, 2007 10:25:20 AM ...HttpGDataRequest execute
FINER: Content-Type: application/atom+xml; charset=UTF-8
Jun 7, 2007 10:25:20 AM ...HttpGDataRequest execute
FINER: Last-Modified: Thu, 07 Jun 2007 17:25:22 GMT
...
Jun 7, 2007 10:25:20 AM ...XmlParser startElement
FINE: Start element id
Jun 7, 2007 10:25:20 AM ...XmlParser endElement
FINE: End element id
...
Jun 7, 2007 10:25:20 AM ...XmlParser startElement
FINE: Start element title
Jun 7, 2007 10:25:20 AM ...XmlParser startElement
FINER: Attribute type='text'
Jun 7, 2007 10:25:20 AM ...XmlParser endElement
FINE: End element title
...
Jun 7, 2007 10:25:20 AM ...XmlParser endElement
FINE: End element entry
...
Jun 7, 2007 10:25:20 AM ...XmlParser endElement
FINE: End element feed

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

بالطبع، إذا لم تكن Java مناسبة لك، يمكنك تجربة .NET.

NET.

لالتقاط عدد الزيارات عبر HTTP في مكتبة برامج عميل ‎ .NET، يمكنك استبدال أداة إنشاء الطلبات التلقائية في العميل بـ GDataLoggingRequestFactory.

يتم إنشاء طلبات HTTP في مكتبة ‎ .NET بواسطة GDataRequestFactory الموجود داخل كل عنصر Service. لا تنفّذ أدوات إنشاء الطلبات العادية أي تسجيل، ولكن GDataLoggingRequestFactory، وهو فئة فرعية من GDataRequestFactory، يتضمّن تسجيلًا مدمجًا. يمكنك تحديد المسار الكامل لملف السجل من خلال ضبط CombinedFileName.

بعد إعداد مصنع الطلبات، عليك استبدال مصنع الطلبات في عنصر الخدمة من خلال ضبط RequestFactory لعنصر الخدمة. قد يبدو الرمز البرمجي على النحو التالي:

using System;
using Google.GData.Client;
using Google.GData.Extensions;
using Google.GData.Spreadsheets;

namespace LogginTest
{
   
class Program
   
{
       
static void Main(string[] args)
       
{
           
SpreadsheetsService service = new SpreadsheetsService("-exampleApp-1");
            service
.setUserCredentials(email, password);

           
Google.GData.Client.GDataLoggingRequestFactory factory = new GDataLoggingRequestFactory("wise", "SpreadsheetsLoggingTest");
            factory
.MethodOverride = true;
            factory
.CombinedLogFileName = "c:\\temp\\xmllog.log";
           
Console.WriteLine("Log file name:" + factory.CombinedLogFileName);
           
            service
.RequestFactory = factory;

           
SpreadsheetQuery query = new SpreadsheetQuery();
           
SpreadsheetFeed feed = service.Query(query);

           
Console.WriteLine("Your spreadsheets:");
           
foreach (SpreadsheetEntry entry in feed.Entries)
           
{
               
Console.WriteLine(entry.Title.Text);
           
}

           
Console.ReadKey();
       
}
   
}
}

يحتوي ملف السجل الناتج على طلبات XML وردودها. إليك مثالاً مختصراً تم تنسيقه باستخدام tidy.

<?xml version='1.0' encoding='utf-8'?>

<feed xmlns='http://www.w3.org/2005/Atom'
xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/'>
  <id>
  http://spreadsheets.google.com/feeds/spreadsheets/private/full</id>
  <updated>2007-06-07T22:05: 02.674Z</updated>
  <link rel='self' type='application/atom+xml'
  href='http://spreadsheets.google.com/feeds/spreadsheets/private/full'>

  </link>
  ...
  <entry>
    <updated>2007-03-28T17:28:57.250Z</updated>
    <category scheme=' http://schemas.google.com/spreadsheets/2006'
    term='http://schemas.google.com/spreadsheets/2006#spreadsheet'>
    <title type='text'>events</title>

    <content type='text'>events</content>
    ...
  </entry>
  <entry>
    <updated>2007-05-25T22:11:08.200Z</updated>

    <category scheme=' http://schemas.google.com/spreadsheets/2006'
    term='http://schemas.google.com/spreadsheets/2006#spreadsheet'>
    </category>
    <title type='text'>UnitTest</title>
    <content type='text'>UnitTest</content>
    ...
  </entry>

  ...
</feed>

ولكن ربما تكون مهتمًا حقًا بلغات البرمجة النصية، وتفضّل استخدام Python.

Python

لالتقاط زيارات HTTP في مكتبة برامج Python، يمكنك عرض زيارات عنوان HTTP في وحدة التحكّم من خلال تفعيل وضع تصحيح الأخطاء في برنامج HTTP. يحتوي عنصر الخدمة على عضو تصحيح أخطاء يمكنك ضبطه على True.

سيؤدي ضبط وضع تصحيح الأخطاء على "صحيح" إلى ضبط علامة تصحيح الأخطاء في العنصر الأساسي HTTPRequest الذي يتضمّنه عنصر الخدمة.

في ما يلي مثال يعرض عناوين HTTP التي يتم إرسالها من خادم جداول البيانات عندما تطلب قائمة بجداول البيانات.

#!/usr/bin/python

import gdata.spreadsheet.service

client
= gdata.spreadsheet.service.SpreadsheetsService()
client
.debug = True

client
.ClientLogin(email, password)

feed
= client.GetSpreadsheetsFeed()

for entry in feed.entry:
 
print entry.title.text

وسيظهر لك ما يلي في وحدة التحكّم:

reply: 'HTTP/1.1 200 OK\r\n'
header: Content-Type: application/atom+xml; charset=UTF-8
header: Last-Modified: Thu, 07 Jun 2007 18:22:35 GMT
header: Cache-Control: max-age=0, must-revalidate, private
header: Transfer-Encoding: chunked
...
header: Date: Thu, 07 Jun 2007 18:22:35 GMT
header: Server: GFE/1.3

عند تنفيذ عمليات إضافية، مثل الإدراج أو التعديل، ستظهر لك بيانات الطلب المقابلة في وحدة التحكّم.

الخاتمة

أوضحت هذه المقالة التعليمية الموجزة كيفية إضافة وظيفة تسجيل أساسية إلى برنامج Java أو ‎.NET أو Python يستخدم مكتبات برامج Google Data API. يمكن أن تكون هذه الأساليب مفيدة إذا كنت بحاجة إلى تصحيح أخطاء عمليات تبادل HTTP، ولكن ليس لديك إذن بالوصول إلى أداة تحليل حزم البيانات. هذه الأمثلة هي مجرد بداية. العديد من آليات التسجيل المتوفّرة في هذه اللغات أكثر فعالية بكثير من تلك المعروضة هنا. إذا أردت الحصول على مزيد من المعلومات حول التسجيل أو Google Data APIs، يمكنك الاطّلاع على قائمة المراجع أدناه.

يمكنك العثور على مكتبات البرامج التي تتناولها هذه المقالة في الصفحات التالية:

عناصر قاعدة المعلومات ذات الصلة:

مجموعات المناقشة: لدينا عدد كبير منها، وسنضيف المزيد مع طرح المزيد من واجهات Google Data APIs. نراقب المجموعات بفعالية.

إذا كانت لديك أسئلة أو اقتراحات، يسرّني تلقّيها منك. انضم إلى مجموعة المناقشة وابدأ في نشر المشاركات.