জুন 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 সম্পর্কে আরও তথ্য চাইলে, নীচের সংস্থানগুলির তালিকাটি দেখুন৷
এই নিবন্ধে কভার করা ক্লায়েন্ট লাইব্রেরিগুলি এই পৃষ্ঠাগুলিতে পাওয়া যাবে:
সম্পর্কিত জ্ঞান ভিত্তি আইটেম:
- আমি কিভাবে জাভা ক্লায়েন্ট লাইব্রেরিতে HTTP লগিং তথ্য পেতে পারি?
- আমি কিভাবে .NET ক্লায়েন্ট লাইব্রেরিতে HTTP লগিং তথ্য পেতে পারি?
- HTTP ডিবাগিং জন্য কিছু ভাল টুল কি কি?
- গুগল স্প্রেডশীট এপিআই কি?
আলোচনা গোষ্ঠী: আমাদের কাছে বেশ কয়েকটি রয়েছে, আরও বেশি আসছে যেহেতু আরও Google ডেটা এপিআই রোল আউট হয়েছে৷ আমরা সক্রিয়ভাবে গ্রুপগুলি পর্যবেক্ষণ করি।
আপনার যদি প্রশ্ন বা পরামর্শ থাকে, আমি আপনার কাছ থেকে শুনতে উপভোগ করব। আলোচনা গোষ্ঠীতে হোপ করুন এবং পোস্ট করা শুরু করুন।