حزيران (يونيو) 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، فراجع قائمة الموارد أدناه.
يمكن العثور على مكتبات العملاء المذكورة في هذه المقالة على الصفحات التالية:
عناصر قاعدة المعرفة ذات الصلة:
- كيف يمكنني الحصول على معلومات تسجيل HTTP في مكتبة عميل جافا؟
- كيف يمكنني الحصول على معلومات تسجيل HTTP في مكتبة عميل NET.؟
- ما هي بعض الأدوات الجيدة لتصحيح أخطاء HTTP؟
- ما المقصود بواجهة برمجة التطبيقات لجداول بيانات Google؟
مجموعات المناقشة: لدينا عدد قليل جدًا، ولكن سيتم طرح المزيد عند طرح المزيد من واجهات برمجة التطبيقات لبيانات Google. نحن نراقب المجموعات بفعالية.
- واجهة برمجة تطبيقات جداول بيانات Google
- واجهة برمجة تطبيقات "تقويم Google"
- Blogger API
- واجهة برمجة تطبيقات Google Base
- واجهة برمجة تطبيقات ألبومات الويب بيكاسا
إذا كانت لديك أسئلة أو اقتراحات، فيسعدني سماعها. انتقل إلى مجموعة المناقشة وابدأ النشر.