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

جيفري سكودر، فريق Google Data APIs
حزيران (يونيو) 2007

المقدمة

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

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

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

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

لغة Java

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

تحتوي مكتبة عميل جافا لبيانات Google على فئات منفصلة للتعامل مع طلبات HTTP وتحليل XML، وبالتالي أحتاج إلى إنشاء عنصرين من المسجّلات، بحيث يكون أحدهما لكل فئة: تعالج 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 للسماح لك بتخزين بيانات السجل للاستخدام لاحقًا.

بالطبع، إذا لم تكن جافا هي حقيبتك، فيمكنك تجربة .NET.

NET.

لالتقاط حركة بيانات HTTP في مكتبة عميل NET.، يمكنك استبدال المصنع التلقائي للطلب في البرنامج بـ GDataLoggingRequestFactory.

يتم إنشاء طلبات HTTP في مكتبة NET .بواسطة GDataRequestFactory الموجود داخل كل كائن خدمة. لا تنفّذ مصانع الطلب العادية أي عملية تسجيل، لكنّ 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 واستجاباته. في ما يلي مثال مختصر تم تنسيقه باستخدام الترتيب.

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

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

الخاتمة

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

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

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

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

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