การใช้ชีวิตผ่านผู้อื่น: การใช้พร็อกซีเซิร์ฟเวอร์กับไลบรารีของไคลเอ็นต์ Google Data API

Jeff Fisher ทีม Google Data API
มิถุนายน 2007

บทนำ: ทำไมต้องใช้พร็อกซี

พร็อกซีเซิร์ฟเวอร์คือคอมพิวเตอร์ (หรือบริการในคอมพิวเตอร์) ที่ส่งคำขอในนามของคอมพิวเตอร์ไคลเอ็นต์หลายเครื่อง โดยมักจะส่งไปยังแหล่งข้อมูลภายนอก บทความนี้เกี่ยวข้องกับพร็อกซีเซิร์ฟเวอร์ HTTP เนื่องจาก HTTP เป็นโปรโตคอลที่ใช้ในการเข้าถึง API สาธารณะสำหรับบริการเว็บของ Google นอกจากนี้ พร็อกซี HTTPS หรือ SSL ยังเป็นที่น่าสนใจเมื่อส่งคำขอ HTTP ที่มีข้อมูลที่ละเอียดอ่อน เช่น ข้อมูลส่วนตัวของผู้ใช้หรือรหัสผ่าน ปัจจุบันบริษัทขนาดใหญ่หลายแห่งใช้พร็อกซี HTTP เพื่อควบคุมว่าพนักงานจะดูเว็บไซต์หรือข้อมูลใดบนอินเทอร์เน็ตได้ ห้องสมุดสาธารณะและโรงเรียนก็เป็นที่ทราบกันว่าใช้พร็อกซีเพื่อวัตถุประสงค์นี้เช่นกัน นอกจากนี้ ยังมีพร็อกซีเซิร์ฟเวอร์ที่เผยแพร่ต่อสาธารณะจำนวนมากซึ่งใช้เพื่อเข้าถึงเนื้อหาเว็บโดยไม่ระบุตัวตนได้

ปัญหาที่อาจเกิดขึ้นเมื่อใช้พร็อกซีเซิร์ฟเวอร์จะขึ้นอยู่กับซอฟต์แวร์ที่ใช้และวิธีกำหนดค่า พร็อกซีจะถือว่า "โปร่งใส" หากไม่ได้เปลี่ยนแปลงคำขอจากไคลเอ็นต์หรือการตอบกลับจากเซิร์ฟเวอร์ในลักษณะใดๆ นอกเหนือจากที่จำเป็นสำหรับการระบุและการตรวจสอบสิทธิ์พร็อกซี อย่างไรก็ตาม พร็อกซีเซิร์ฟเวอร์จำนวนมากจะแก้ไขคำขอหรือคำตอบในลักษณะที่นักพัฒนาซอฟต์แวร์ควรทราบ โดยเฉพาะอย่างยิ่ง พร็อกซีบางตัวจะเปลี่ยนประเภทเนื้อหาของการตอบกลับหรือนำส่วนหัว HTTP Keep-Alive ออกจากการส่งไปยังเซิร์ฟเวอร์ภายนอกที่โฮสต์ทรัพยากร

แล้วเหตุใดนักพัฒนาแอปจึงต้องการใช้พร็อกซี HTTP หรือ SSL โดยทั่วไปแล้ว มีสาเหตุ 2 ประการที่ทำให้ต้องใช้พร็อกซี ได้แก่ โครงสร้างพื้นฐานขององค์กรบางแห่งกำหนดให้ใช้ หรือนักพัฒนาซอฟต์แวร์ต้องการแก้ไขข้อบกพร่องของแอปพลิเคชันที่ใช้บริการเว็บ เหตุผลแรกคือหลีกเลี่ยงไม่ได้โดยสิ้นเชิงหากกฎสำหรับเครือข่ายที่นักพัฒนาแอป กำลังทำงานอยู่ห้ามการเชื่อมต่อเว็บหรือ SSL ที่ไม่ได้ผ่านพร็อกซีกับเว็บไซต์ภายนอก นักพัฒนาแอปที่พยายามแก้ปัญหาเมื่อต้องจัดการกับเว็บเซอร์วิสของ Google มักจะรายงานสาเหตุหลังนี้ในฟอรัมการสนับสนุนของเรา มีพร็อกซี "การแก้ไขข้อบกพร่อง" แบบเฉพาะทาง เช่น Fiddler และ Charles ที่ออกแบบมาเพื่อสถานการณ์นี้โดยเฉพาะ ดูข้อมูลเพิ่มเติมเกี่ยวกับการใช้พร็อกซี เซิร์ฟเวอร์นี้ได้ในบทความOn the Wire: Tools for API Developers

การเพิ่มการรองรับพร็อกซีเซิร์ฟเวอร์อาจเป็นเรื่องยากสำหรับแอปพลิเคชันบางอย่าง โชคดีที่ไลบรารีของไคลเอ็นต์ส่วนใหญ่สำหรับ Google Data API สามารถใช้กับพร็อกซีเซิร์ฟเวอร์ HTTP ได้หลังจากแก้ไขโค้ดเล็กน้อย บทความนี้ มีไว้เพื่อเป็นจุดเริ่มต้นสำหรับนักพัฒนาแอปที่ต้องการใช้ พร็อกซีเซิร์ฟเวอร์สำหรับคำขอเว็บที่แอปพลิเคชันของตนสร้างขึ้น

Java

การใช้พร็อกซี HTTP กับไลบรารีของไคลเอ็นต์ Java เป็นเรื่องง่ายเนื่องจาก Sun ใช้พร็อพเพอร์ตี้ของระบบเพื่อจัดการการตั้งค่าการเชื่อมต่อ

ตัวอย่างเช่น หากพร็อกซีเซิร์ฟเวอร์ขององค์กรทำงานบน "my.proxy.domain.com" ในพอร์ต 3128 คุณจะเพิ่มโค้ดต่อไปนี้ลงในโค้ดก่อนสร้างออบเจ็กต์บริการสำหรับ Google ปฏิทิน, Google ชีต ฯลฯ ได้

System.setProperty("http.proxyHost", "my.proxy.domain.com");
System.setProperty("http.proxyPort", "3128");

หรือคุณจะทำในบรรทัดคำสั่งเมื่อเริ่มสภาพแวดล้อมของเซอร์ฟเล็ตก็ได้

java -Dhttp.proxyHost=my.proxy.domain.com -Dhttp.proxyPort=3128

ในแพ็กเกจ JSSE เวอร์ชันล่าสุด คุณสามารถขยายการใช้งานนี้ไปยังพร็อกซี SSL ได้ด้วย หากพร็อกซีเซิร์ฟเวอร์เดียวกันในตัวอย่างก่อนหน้าเรียกใช้พร็อกซี SSL ในพอร์ต 3129 โค้ดที่จำเป็นจะเป็นดังนี้

System.setProperty("https.proxyHost", "my.proxy.domain.com");
System.setProperty("https.proxyPort", "3129");

ซึ่งทําได้จากบรรทัดคําสั่งในลักษณะเดียวกับพร็อกซี HTTP

ในบางครั้ง คุณอาจต้องระบุข้อมูลเข้าสู่ระบบให้กับพร็อกซีเซิร์ฟเวอร์เพื่อใช้งาน โดยปกติแล้ว จะมีการส่งโดยใช้แฮช base64 ที่รวมอยู่ในส่วนหัว HTTP ดังนี้

String encoded = new String(Base64.encodeBase64(new String("username:password").getBytes()));
String base64encodedCredentials = "Basic " + encoded;
myService.getRequestFactory().setPrivateHeader("Proxy-Authorization", base64encodedCredentials);

โปรดทราบว่าโค้ดด้านบนใช้แพ็กเกจ Apache Commons Codec เพื่อทำการเข้ารหัส base64 ที่จำเป็น คุณจะต้องนำเข้าคลาส org.apache.commons.codec.binary.Base64 เพื่อเรียกใช้โค้ดด้านบน

.NET

การใช้พร็อกซี HTTP กับไลบรารีของไคลเอ็นต์ .NET ไม่ใช่เรื่องง่ายเหมือนกับไคลเอ็นต์ Java แต่ก็สามารถทำได้ในลักษณะเดียวกันเมื่อสร้างออบเจ็กต์บริการสำหรับผลิตภัณฑ์หนึ่งๆ

ตัวอย่างเช่น เราอาจต้องการใช้พร็อกซีเพื่อโต้ตอบกับบริการ Google ปฏิทิน

using System.Net;

CalendarService service = new CalendarService("CalendarSampleApp");
query.Uri = new Uri(calendarURI);
GDataRequestFactory requestFactory = (GDataRequestFactory) service.RequestFactory;
IWebProxy iProxy = WebRequest.DefaultWebProxy;
WebProxy myProxy = new WebProxy(iProxy.GetProxy(query.Uri));
// potentially, setup credentials on the proxy here
myProxy.Credentials = CredentialCache.DefaultCredentials;
myProxy.UseDefaultCredentials = true;
requestFactory.Proxy = myProxy;

ซึ่งควรตรวจหาพร็อกซีที่จำเป็นจากการตั้งค่าการเชื่อมต่ออินเทอร์เน็ตของคุณ ซึ่งเป็นฟีเจอร์ที่ยอดเยี่ยมของไลบรารี .NET อย่างไรก็ตาม หากไม่เชื่อถือให้ค้นหาพร็อกซีอย่างถูกต้อง คุณก็ตั้งค่าได้โดยเปลี่ยนโค้ดเป็น

using System.Net;

CalendarService service = new CalendarService("CalendarSampleApp");
GDataRequestFactory requestFactory = (GDataRequestFactory) service.RequestFactory;
WebProxy myProxy = new WebProxy("http://my.proxy.example.com:3128/",true);
// potentially, setup credentials on the proxy here
myProxy.Credentials = CredentialCache.DefaultCredentials;
myProxy.UseDefaultCredentials = true;
requestFactory.Proxy = myProxy;

บทสรุป

บทความนี้ได้กล่าวถึงวิธีทำให้ไลบรารีของไคลเอ็นต์ Google Data API บางส่วนทำงานร่วมกับเซิร์ฟเวอร์พร็อกซี HTTP นักพัฒนาแอปที่ทำงานผ่านพร็อกซีเซิร์ฟเวอร์ตามที่นโยบายเครือข่ายกำหนดจะยังคงใช้ไลบรารีเหล่านี้ได้ นักพัฒนาแอปยังใช้พร็อกซีเซิร์ฟเวอร์เพื่อช่วยแก้ไขข้อบกพร่องของโค้ดได้ด้วย โดยให้พร็อกซีเซิร์ฟเวอร์บันทึกเนื้อหาของคำขอและการตอบกลับ HTTP ที่ส่งไปยังและจากเว็บเซอร์วิสของ Google นอกจากนี้ยังมี Use Case ขั้นสูงเพิ่มเติมของพร็อกซีเซิร์ฟเวอร์และไลบรารีไคลเอ็นต์อื่นๆ ที่บทแนะนำนี้ไม่ได้กล่าวถึง เราขอแนะนำให้นักพัฒนาแอปที่ต้องการความช่วยเหลือเพิ่มเติมเข้าร่วมกลุ่มสนับสนุนสาธารณะของเราตามลิงก์ด้านล่าง

ดูข้อมูลเพิ่มเติมเกี่ยวกับไลบรารีของไคลเอ็นต์ที่ใช้ในบทความนี้ได้ที่หน้าเว็บต่อไปนี้

แหล่งข้อมูลอื่นๆ