บทนำ
บทความเก่าของเจ้าของบทความ (
Prepare a JSON Web Service and access it with JQuery), ได้อธิบายเกียวกับ JSON, วิธีที่จะ return JSON data จาก Web Service, และวิธีใช้ JSON-enabled Web Service โดย JQuery. โดยในบทความนี้, จะอธิบายวิธีใช้งาน JavaScript Object Notation with Padding (JSONP), ที่เป็น extended concept จาก JSON, สามารถถูกใช้งานเพื่อแก้ปัญหาสำหรับ cross domain.
คืออะไรและใช้ทำไม JSONP?
AJAX เป็น key technology ใน web 2.0 ที่เริ่มใช้ในวงกว้างใน web sites. AJAX ใช้ XMLHttpRequest
client side API เพื่อติดต่อกับ server แบบ background. ไม่ว่าอย่างไร, สิ่งที่ไม่อนุญาตให้ทำการสื่อสาร cross domain เนื่องจากเหตุผลด้าน security. JavaScript Object Notation with Padding (JSONP) เป็นทางที่ลดช่องว่าง JSON data จาก external domains. ซึ่งเป็นวิธีที่ดีกว่าและเขาใจได้ง่ายกว่าวิธีอื่น ๆ (เช่น web proxy และ IFrame) เพื่อเอาข้อมูลจาก external domain.
Same-Origin Policy
นโยบาย Same-origin เป็นconcept ในแบบ browser-side programming languages (เช่น JavaScript) กับการอนุญาตให้เข้าถึง resources ในเว็บไซต์เดียวกัน (domain เดียวกัน) แต่ป้องกันการเข้าถึง resources จากต่าง domains. ที่เหนือกว่านโยบาย same origin, ซึ่งมีสองวิธีที่นิยมใช้กัน:
ใช้ Proxy Web Service
XMLHttpRequest
(ใน AJAX) ไม่อนูุญาตให้เรียก cross domain, โดยปกติใช้วิธีการใช้ proxy Web Service เพื่อ access third party data. ถ้าคุณมีเว็บไซต์โดเมน www.mydomain.com และคุณต้องการ access data จาก domain อื่นเช่นเรียก www.thirdpartydomain.com. โดย AJAX, คุณไม่สามารถเข้าตรงจาก Web Service บน www.thirdpartydomain.com, แต่คุณสามารถเขียน Web Service จาก domain ของคุณเพื่อเข้าไปเอาข้อมูลจาก www.thirdpartydomain.com. ที่แสดงในรูปที่ 1:
Figure 1: การใช้ proxy Web Service เพื่อเข้าถึงข้อมูลจาก different domain
นี้เป็นวิธีการทำงานของ XMLHttpRequest
เรียก Web Service (จาก the proxy Web Service) ใน domain ของตัวเองและจากนั้น proxy Web Service เรียก Web Service ที่แท้จริงต่อไปที different domain. แต่วิธีที่ง่ายและใช้ในวงกว้างในการแก้ปัญหา, มันใช้ Web Service สองครั้ง, ซึ่งทำให้ล่าช้า. ดังนั้นทุก ๆ การเรียก external Web Service แล้ว requires กลับมาที่เว็บ Web Service ของเรา, ซึ่งจะทำให้ server ของเลามีภาระกับ thread เพื่อ process มากขึ้น.