Google Data API क्लाइंट की गड़बड़ियां ठीक करना: अपने प्रोग्राम से ट्रैफ़िक एक्सप्लोर करना

Jeffrey Scudder, Google Data APIs Team
जून 2007

परिचय

कभी-कभी, यह देखना ज़रूरी होता है कि नेटवर्क पर क्या डेटा भेजा जा रहा है. यह खास तौर पर ऐसे सॉफ़्टवेयर के लिए ज़रूरी है जो Google Data APIs जैसी वेब सेवाओं का इस्तेमाल करता है. इनमें कई कार्रवाइयों के लिए एचटीटीपी अनुरोध करने पड़ते हैं. अगर आपको कोई और तरीका काम नहीं करता है, तो यह पुष्टि की जा सकती है कि आपका प्रोग्राम आपकी उम्मीद के मुताबिक काम कर रहा है या नहीं. इसके लिए, ट्रांसमिट और रिसीव किए गए बाइट की असल संख्या देखें. Google Data API के लिए उपलब्ध कई क्लाइंट लाइब्रेरी में डीबग मोड होता है. यह मोड, एचटीटीपी ट्रैफ़िक दिखाता है. यह सुविधा खास तौर पर तब काम आती है, जब आपके पास WireShark या Fiddler जैसे पैकेट स्निफ़र का ऐक्सेस न हो.

मैंने कई बार अपने प्रोग्राम को सही माना, लेकिन पैकेट ट्रेस की जांच करने पर पता चला कि उसमें एक अतिरिक्त नई लाइन का वर्ण या गलत नाम वाला एचटीटीपी हेडर मौजूद है. एचटीटीपी ट्रैफ़िक को देखे बिना किसी वेब सेवा के लिए प्रोग्रामिंग करना, आंखों को बंद करके सुई में धागा डालने जैसा है.

हालांकि, ऐसा हो सकता है कि आपको ऐसी स्थिति का सामना करना पड़े जहां पैकेट स्निफ़र उपलब्ध न हो या एन्क्रिप्ट (सुरक्षित) किए गए पैकेट को प्रोसेस करने के लिए सही न हो. चिंता न करें. प्रोग्राम में लॉगिंग की कुछ सुविधाओं का इस्तेमाल करके, इस सीमा को पार किया जा सकता है. लॉगिंग की इन सुविधाओं का इस्तेमाल करके, एक्सचेंज किए गए कुछ या सभी डेटा को देखा जा सकता है. भले ही, वह एन्क्रिप्ट (सुरक्षित) किया गया एचटीटीपीएस डेटा हो या रिमोट रनिंग कोड.

इस लेख के लिए, मैंने Google Data API की क्लाइंट लाइब्रेरी का इस्तेमाल करके, तीन भाषाओं में डाइग्नोस्टिक कोड का सैंपल लिखा है. ये भाषाएं Java, .NET, और Python हैं. हर उदाहरण में, मैंने लॉगिंग या डीबगिंग चालू की है. साथ ही, क्लाइंट लॉगिन का इस्तेमाल करके पुष्टि की है. इसके बाद, मैंने अपनी Google Sheets की सूची पाई है और उनके टाइटल प्रिंट किए हैं.

Java

क्लाइंट लाइब्रेरी में मौजूद कुछ मुख्य ऑब्जेक्ट के लिए, लॉगिंग लेवल सेट करने के लिए java.util.logging क्लास का इस्तेमाल किया जा सकता है. इससे ट्रैफ़िक डेटा भी दिखेगा. यहां दिए गए उदाहरण में, मैंने एचटीटीपी हेडर और एक्सएमएल पार्सर की गतिविधियों को चुना है, ताकि मुझे यह पता चल सके कि वायर पर क्या ट्रांसफ़र हो रहा है.

Google Data Java क्लाइंट लाइब्रेरी में, एचटीटीपी अनुरोधों और एक्सएमएल पार्सिंग को मैनेज करने के लिए अलग-अलग क्लास होती हैं. इसलिए, मुझे दो लॉगर ऑब्जेक्ट बनाने होंगे. हर क्लास के लिए एक लॉगर ऑब्जेक्ट बनाना होगा: com.google.gdata.client.http.HttpGDataRequest एचटीटीपी ट्रैफ़िक को मैनेज करता है, जबकि com.google.gdata.util.XmlParser एक्सएमएल पार्सिंग के लिए ज़िम्मेदार है.

लॉगर इंस्टेंस, 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

ये लॉग काफ़ी बड़े हो सकते हैं. इसलिए, आपको Loggers के लेवल सेट करते समय ज़्यादा सावधानी बरतनी चाहिए. बाद में इस्तेमाल करने के लिए, लॉग डेटा को सेव करने की अनुमति देने के लिए, ConsoleHandler के बजाय FileHandler भी बनाया जा सकता है.

अगर आपको Java पसंद नहीं है, तो .NET का इस्तेमाल किया जा सकता है.

.NET

.NET क्लाइंट लाइब्रेरी में एचटीटीपी ट्रैफ़िक कैप्चर करने के लिए, क्लाइंट में डिफ़ॉल्ट अनुरोध फ़ैक्ट्री को GDataLoggingRequestFactory से बदला जा सकता है.

.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();
       
}
   
}
}

इस लॉग फ़ाइल में, एक्सएमएल अनुरोध और जवाब शामिल होते हैं. यहां एक छोटा उदाहरण दिया गया है, जिसे मैंने 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

Python क्लाइंट लाइब्रेरी में एचटीटीपी ट्रैफ़िक कैप्चर करने के लिए, एचटीटीपी क्लाइंट में डीबग मोड चालू करके, एचटीटीपी हेडर ट्रैफ़िक को कंसोल पर दिखाया जा सकता है. सेवा ऑब्जेक्ट में एक डीबग मेंबर होता है, जिसे True पर सेट किया जा सकता है.

debug को true पर सेट करने से, सेवा ऑब्जेक्ट में मौजूद HTTPRequest ऑब्जेक्ट में debug फ़्लैग सेट हो जाएगा.

यहां एक उदाहरण दिया गया है. इसमें, स्प्रेडशीट सर्वर से भेजे गए एचटीटीपी हेडर की जानकारी दिखेगी. ऐसा तब होगा, जब स्प्रेडशीट की सूची मांगी जाएगी.

#!/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

डेटा डालने या अपडेट करने जैसी अतिरिक्त कार्रवाइयां करने पर, आपको अपनी कंसोल स्क्रीन पर अनुरोध से जुड़ा डेटा दिखेगा.

नतीजा

इस छोटे ट्यूटोरियल में बताया गया है कि Google Data API की क्लाइंट लाइब्रेरी का इस्तेमाल करने वाले Java, .NET या Python प्रोग्राम में, लॉगिंग की बुनियादी सुविधा कैसे जोड़ी जा सकती है. अगर आपको एचटीटीपी एक्सचेंज को डीबग करना है, लेकिन आपके पास पैकेट स्निफ़र का ऐक्सेस नहीं है, तो ये तकनीकें आपके काम आ सकती हैं. इन उदाहरणों में, मैंने सिर्फ़ कुछ ही तरह के प्रॉम्प्ट के बारे में बताया है. इन भाषाओं में मौजूद कई लॉगिंग सिस्टम, यहां दिखाए गए सिस्टम से ज़्यादा बेहतर हैं. अगर आपको लॉगिंग या Google Data API के बारे में ज़्यादा जानकारी चाहिए, तो यहां दिए गए संसाधनों की सूची देखें.

इस लेख में शामिल क्लाइंट लाइब्रेरी, इन पेजों पर मिल सकती हैं:

मिलते-जुलते नॉलेज बेस आइटम:

चर्चा वाले ग्रुप: हमारे पास कई ग्रुप हैं. Google Data API के ज़्यादा से ज़्यादा वर्शन रोल आउट होने पर, इनकी संख्या और बढ़ेगी. हम ग्रुप पर लगातार नज़र रखते हैं.

अगर आपका कोई सवाल है या आपके पास कोई सुझाव है, तो हमें बताएं. चर्चा ग्रुप में शामिल हों और पोस्ट करना शुरू करें.