มิถุนายน 2007
บทนำ
บางครั้งก็ไม่มีสิ่งใดทดแทนสายไฟ โดยเฉพาะอย่างยิ่งเมื่อเขียนซอฟต์แวร์ที่ใช้บริการเว็บ เช่น Google Data API ซึ่งการทํางานจํานวนมากเกี่ยวข้องกับการส่งคําขอ HTTP หากข้อผิดพลาดอื่นๆ ล้มเหลว คุณตรวจสอบได้ว่าโปรแกรมของคุณกําลังทําในสิ่งที่คุณคาดหวังหรือไม่โดยดูไบต์ที่ส่งและได้รับจริง ไลบรารีของไคลเอ็นต์จํานวนมากสําหรับ Google Data API มีโหมดแก้ไขข้อบกพร่องที่แสดงการรับส่งข้อมูล HTTP ซึ่งจะเป็นประโยชน์อย่างยิ่งหากคุณไม่มีสิทธิ์เข้าถึงสไนเปอร์แพ็กเก็ต เช่น WireShark หรือ Fiddler
ฉันไม่สามารถนับจํานวนครั้งที่อาจมีการทําเครื่องหมายโปรแกรมของฉันว่าถูกต้อง แต่มีเพียงการตรวจสอบการตรวจสอบการติดตามของแพ็กเก็ตที่มีอักขระขึ้นบรรทัดใหม่หรือส่วนหัว HTTP ที่ไม่ถูกต้อง การจัดโปรแกรมให้กับบริการบนเว็บโดยไม่ต้องดูการเข้าชม HTTP อาจเหมือนกับการพยายามแยกสายนาฬิกาเข้ากันแบบปิดตา
อย่างไรก็ตาม คุณอาจพบตัวเองในสถานการณ์ที่เครื่องมือตรวจสอบแพ็กเก็ตไม่พร้อมใช้งานหรือไม่เพียงพอในการจัดการกับแพ็กเก็ตที่เข้ารหัส อย่ากลัวที่จะหลีกเลี่ยงข้อจํากัดนี้โดยใช้ประโยชน์จากกลไกการบันทึกในโปรแกรม การใช้ประโยชน์จากฟีเจอร์การบันทึกข้อมูลเหล่านี้จะช่วยให้คุณดูข้อมูลที่แลกเปลี่ยนได้บางส่วนหรือทั้งหมด (แม้จะไม่ใช่ข้อมูล HTTPS ที่เข้ารหัสหรือโค้ดระยะไกล)
สําหรับบทความนี้ ฉันเขียนโค้ดการวินิจฉัยตัวอย่างใน 3 ภาษาโดยใช้ไลบรารีของไคลเอ็นต์ของ Google Data API สําหรับ Java, .NET และ Python ในแต่ละตัวอย่าง ฉันได้เปิดการบันทึกหรือการแก้ไขข้อบกพร่อง ตรวจสอบสิทธิ์โดยใช้การเข้าสู่ระบบไคลเอ็นต์ แล้วรับรายการสเปรดชีต Google ของฉันและพิมพ์ชื่อสเปรดชีต
Java
คุณใช้คลาส java.util.logging
เพื่อกําหนดระดับการบันทึก (และเปิดเผยข้อมูลการเข้าชม) สําหรับออบเจ็กต์หลัก 2-3 รายการในไลบรารีของไคลเอ็นต์ได้ ในตัวอย่างด้านล่าง เราเลือกดูที่ส่วนหัว HTTP และกิจกรรมของโปรแกรมแยกวิเคราะห์ XML เพื่อเห็นสิ่งที่กําลังเดินผ่านสายไฟอย่างสมบูรณ์
ไลบรารีของไคลเอ็นต์ Google Data Java มีคลาสแยกต่างหากสําหรับจัดการคําขอ HTTP และการแยกวิเคราะห์ XML ดังนั้นฉันต้องสร้างออบเจ็กต์ตัวบันทึก 2 รายการสําหรับแต่ละคลาส ดังนี้
com.google.gdata.client.http.HttpGDataRequest
จะจัดการกับการเข้าชม HTTP ขณะที่ com.google.gdata.util.XmlParser
มีหน้าที่ในการแยกวิเคราะห์ XML
อินสแตนซ์ของตัวบันทึกจะบันทึกกิจกรรมสําหรับ HttpGDataRequest
และ XmlParser
และคุณจะควบคุมระดับรายละเอียดของเอาต์พุตของตัวบันทึกแต่ละรายการได้ ในการสาธิตนี้ เราได้เลือกที่จะดูเหตุการณ์ทั้งหมดที่สร้างโดยออบเจ็กต์ HttpGDataRequest
และ XmlParser
เมื่อสร้างและกําหนดค่าเครื่องมือบันทึกแล้ว ฉันต้องแจ้งว่าต้องดําเนินการอย่างไรเมื่อได้รับเหตุการณ์จากชั้นเรียน ตอนนี้ฉันอยากเขียนข้อมูลการบันทึกทั้งหมดในคอนโซล
ผมจึงสร้าง ConsoleHandler
และเพิ่มไปยัง Logical ทั้ง 2 ตัว
โค้ดตัวอย่างของฉันมีดังนี้
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
เพื่อให้คุณจัดเก็บข้อมูลบันทึกไว้ใช้ภายหลังได้
แน่นอนว่าหาก Java ไม่ได้เป็นกระเป๋าของคุณ โปรดลองใช้ .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 และการตอบกลับ ต่อไปนี้คือตัวอย่างอักษรย่อที่ฉันจัดรูปแบบโดยใช้ 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
หากต้องการบันทึกการเข้าชม HTTP ในไลบรารีของไคลเอ็นต์ Python คุณสามารถสะท้อนการรับส่งข้อมูลของส่วนหัว HTTP ไปยังคอนโซลโดยการเปิดโหมดแก้ไขข้อบกพร่องในไคลเอ็นต์ HTTP ออบเจ็กต์บริการมีสมาชิกแก้ไขข้อบกพร่องที่คุณตั้งค่าเป็นจริงได้
การตั้งค่าแก้ไขข้อบกพร่องเป็น "จริง" จะกําหนดแฟล็กการแก้ไขข้อบกพร่องในออบเจ็กต์ 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 API โปรดดูรายการแหล่งข้อมูลด้านล่าง
ไลบรารีของไคลเอ็นต์ที่ครอบคลุมในบทความนี้จะอยู่ในหน้าต่อไปนี้
รายการฐานความรู้ที่เกี่ยวข้อง
- ฉันจะรับข้อมูลการบันทึก HTTP ในไลบรารีของไคลเอ็นต์ Java ได้อย่างไร
- ฉันจะรับข้อมูลการบันทึก HTTP ในไลบรารีของไคลเอ็นต์ .NET ได้อย่างไร
- เครื่องมือที่ดีสําหรับการแก้ไขข้อบกพร่อง HTTP มีอะไรบ้าง
- Googleสเปรดชีต API คืออะไร
กลุ่มสนทนา: เรามีค่อนข้างมาก และจะเปิดตัวเพิ่มเติมเมื่อ Google Data API เปิดตัวมากขึ้น เราติดตามดูกลุ่มอย่างเต็มที่
หากคุณมีข้อสงสัยหรือคําแนะนําใดๆ เรายินดีรับฟัง ไปที่กลุ่มสนทนา และเริ่มโพสต์