Google Data API ক্লায়েন্ট ডিবাগ করা: আপনার প্রোগ্রামের মধ্যে থেকে ট্রাফিক অন্বেষণ করা

Jeffrey Scudder, Google Data APIs টিম
জুন 2007

ভূমিকা

কখনও কখনও তারের উপর কি যায় তা দেখার জন্য কোন বিকল্প নেই। এটি বিশেষত সত্য যখন সফ্টওয়্যার লেখার সময় যা Google ডেটা API-এর মতো ওয়েব পরিষেবাগুলি ব্যবহার করে, যেখানে প্রচুর ক্রিয়াকলাপ HTTP অনুরোধ করা জড়িত। যখন অন্য সব ব্যর্থ হয়, তখন আপনি যাচাই করতে পারেন যে আপনার প্রোগ্রামটি প্রকৃত প্রেরিত এবং প্রাপ্ত বাইটগুলি দেখে আপনি যা আশা করতে চান তা করছে। Google Data API-এর জন্য অনেক ক্লায়েন্ট লাইব্রেরিতে একটি ডিবাগিং মোড রয়েছে যা HTTP ট্র্যাফিক প্রদর্শন করে। এটি বিশেষভাবে উপযোগী যখন আপনার কাছে WireShark বা Fiddler- এর মতো প্যাকেট স্নিফার অ্যাক্সেস না থাকে।

আমি কতবার শপথ করতে পারতাম যে আমার প্রোগ্রামটি সঠিক ছিল তা আমি গণনা করতে পারি না, শুধুমাত্র একটি প্যাকেট ট্রেস পরিদর্শন করার পরে একটি অতিরিক্ত নতুন লাইন অক্ষর, বা একটি অপনাম HTTP শিরোনাম ছিল। HTTP ট্র্যাফিকের দিকে না তাকিয়ে একটি ওয়েব পরিষেবার বিরুদ্ধে প্রোগ্রামিং করা আপনার চোখ বন্ধ করে সুই থ্রেড করার চেষ্টা করার মতো হতে পারে।

যাইহোক, আপনি নিজেকে এমন পরিস্থিতিতে খুঁজে পেতে পারেন যেখানে একটি প্যাকেট স্নিফার অনুপলব্ধ বা এনক্রিপ্ট করা প্যাকেটগুলি মোকাবেলা করার জন্য অপর্যাপ্ত। কখনই ভয় পাবেন না- আপনি কিছু ইন-প্রোগ্রাম লগিং প্রক্রিয়া ব্যবহার করে এই সীমাবদ্ধতাটি পেতে পারেন। এই লগিং সুবিধাগুলি ব্যবহার করে, আপনি কিছু, যদি সব না হয়, বিনিময় করা ডেটা দেখতে পারেন, এমনকি এনক্রিপ্ট করা HTTPS ডেটা বা দূরবর্তী চলমান কোডের জন্যও৷

এই নিবন্ধটির জন্য, আমি Java , .NET , এবং Python- এর জন্য Google Data API ক্লায়েন্ট লাইব্রেরি ব্যবহার করে 3টি ভাষায় নমুনা ডায়াগনস্টিক কোড লিখেছি। প্রতিটি উদাহরণে, আমি লগিং বা ডিবাগিং চালু করি, ক্লায়েন্ট লগইন ব্যবহার করে প্রমাণীকরণ করি এবং তারপর আমার Google স্প্রেডশীটের একটি তালিকা পাই এবং তাদের শিরোনাম প্রিন্ট আউট করি।

জাভা

আপনি java.util.logging ক্লাস ব্যবহার করতে পারেন লগিং লেভেল সেট করতে (এবং ফলস্বরূপ ট্রাফিক ডেটা প্রকাশ করতে) ক্লায়েন্ট লাইব্রেরির কয়েকটি মূল বস্তুর জন্য। নীচের উদাহরণে, আমি তারের উপর দিয়ে কী ভ্রমণ করছে তার সম্পূর্ণ দৃষ্টিভঙ্গি পেতে HTTP শিরোনাম এবং XML পার্সারের কার্যকলাপগুলি দেখতে বেছে নিয়েছি।

গুগল ডেটা জাভা ক্লায়েন্ট লাইব্রেরিতে HTTP অনুরোধ এবং এক্সএমএল পার্সিং পরিচালনা করার জন্য আলাদা ক্লাস রয়েছে; এইভাবে, আমাকে দুটি লগার অবজেক্ট তৈরি করতে হবে, প্রতিটি ক্লাসের জন্য একটি: 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

এই লগগুলি বেশ বড় হতে পারে, তাই আপনি লগারদের স্তর সেট করার ক্ষেত্রে আরও নির্বাচনী হতে চাইতে পারেন। আপনি পরবর্তী ব্যবহারের জন্য লগ ডেটা সঞ্চয় করার জন্য ConsoleHandler পরিবর্তে একটি FileHandler তৈরি করতে পারেন।

অবশ্যই, যদি জাভা আপনার ব্যাগ না হয়, আপনি .NET ব্যবহার করে দেখতে পারেন।

.নেট

.NET ক্লায়েন্ট লাইব্রেরিতে HTTP ট্র্যাফিক ক্যাপচার করতে, আপনি একটি GDataLoggingRequestFactory দিয়ে ক্লায়েন্টে ডিফল্ট অনুরোধ ফ্যাক্টরি প্রতিস্থাপন করতে পারেন।

.NET লাইব্রেরিতে HTTP অনুরোধগুলি 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>

কিন্তু সম্ভবত আপনি সত্যিই স্ক্রিপ্টিং ভাষাতে আছেন এবং আপনি পাইথন ব্যবহার করতে পছন্দ করেন।

পাইথন

পাইথন ক্লায়েন্ট লাইব্রেরিতে HTTP ট্র্যাফিক ক্যাপচার করতে, আপনি 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 ডেটা এপিআই রোল আউট হয়েছে৷ আমরা সক্রিয়ভাবে গ্রুপগুলি পর্যবেক্ষণ করি।

আপনার যদি প্রশ্ন বা পরামর্শ থাকে, আমি আপনার কাছ থেকে শুনতে উপভোগ করব। আলোচনা গোষ্ঠীতে হোপ করুন এবং পোস্ট করা শুরু করুন।