การแก้ไขข้อบกพร่องของไคลเอ็นต์ Google Data API: การสํารวจการเข้าชมจากโปรแกรมของคุณ

Jeffrey Scudder ทีม Google Data API
มิถุนายน 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 โปรดดูรายการแหล่งข้อมูลด้านล่าง

ไลบรารีของไคลเอ็นต์ที่ครอบคลุมในบทความนี้จะอยู่ในหน้าต่อไปนี้

รายการฐานความรู้ที่เกี่ยวข้อง

กลุ่มสนทนา: เรามีค่อนข้างมาก และจะเปิดตัวเพิ่มเติมเมื่อ Google Data API เปิดตัวมากขึ้น เราติดตามดูกลุ่มอย่างเต็มที่

หากคุณมีข้อสงสัยหรือคําแนะนําใดๆ เรายินดีรับฟัง ไปที่กลุ่มสนทนา และเริ่มโพสต์