API คืออะไร?
API ย่อมาจาก Application Programming Interface คือการพัฒนาโปรแกรมสำหรับเป็นส่วนติดต่อเซอร์วิสของแอพพลิเคชั่น หรือโมดูลต่างๆ เพื่อให้คนภายนอกมาเรียกใช้งาน หรือกล่าวอย่างง่ายๆ ก็คือการเขียนโปรแกรมเพื่อให้บริการสำหรับให้คนอื่นมาเรียกใช้งาน ซึ่งแนวคิดเรื่องการสร้าง API เพื่อการใช้งานก็มีมาอย่างยาวนานแล้ว ยกตัวอย่างเช่นตั้งแต่ที่มีการสร้างระบบปฎิบัติการ (OS) ก็จะมีการติดต่อ API ของไดร์เวอร์อุปกรณ์ฮาร์แวร์ต่างๆ ของเครื่องคอมพิวเตอร์เพื่อเรียกใช้งานอุปกรณ์นั้นๆ ตามคำสั่งของนักพัฒนา
API ได้รับการกล่าวถึงและอ้างอิงอีกครั้งในรูปแบบของเว็บเซอร์วิสเทคโนโลยี (Web Service) ซึ่งก็คือเราสามารถพัฒนาแอพพลิเคชั่นที่ให้บริการข้อมูลบนโปรโตคอล HTTP โดยใช้หลักการและแนวคิดของ API เพื่อให้คนภายนอกมาเรียกใช้งาน คำถามก็คือว่าทำไมเราต้องเพิ่ม API ลงในระบบของเรา? มีเหตุผล 3 ข้อ คือ
- เราต้องการเปิดให้โมดูลหรือระบบอื่นๆ เข้ามาเรียกใช้ข้อมูลของเราได้
- เราต้องการเตรียมข้อมูลให้เว็บไซต์ในรูปแบบ Asynchronous เช่น การใช้ AJAX
- เราต้องการเตรียมโครงสร้างพื้นฐานสำหรับการทำสถาปัตยกรรมเชิงเซอร์วิส หรือ SOA (Service-Oriented Architecture)
จะเห็นได้ว่าเหตุผลข้างต้นทั้ง 3 ข้อ เป็นแรงผลักดันที่ดีสำหรับการให้ระบบของเราควรจะมี API ซึ่งแน่นอนว่าระบบสมัยใหม่ควรจะเตรียม API ไว้สำหรับเชื่อมต่อกับระบบอื่นๆ เพื่อลดความซ้ำซ้อนของการพัฒนาระบบ เพื่อความเป็นเอกภาพของข้อมูล และการนำข้อมูลไปใช้งานต่อให้เกิดประโยชน์สูงสุด โดยการต่อยอดความสามารถของระบบให้ตรงตามความต้องการของผู้ใช้งาน
หลักคิดในการพัฒนา API
ต้องเข้าใจก่อนว่าเทรนการพัฒนาเว็บแอพพลิเคชั่นในยุคปัจจุบันนั้นเปลี่ยนแปลงไปจากเมื่อก่อนเป็นอย่างมาก เนื่องด้วยการเติบโตอย่างก้าวกระโดดของโมบายดีไวซ์ก็คือโทรศัพท์มือถือแบบสมาร์โฟน โดยเฉพาะการที่โทรศัพท์มือถือสามารถเข้าถึงอินเตอร์เน็ตได้ การทำให้เว็บแอพพลิเคชั่นจะต้องสามารถแสดงผลได้อย่างรวดเร็วและได้ทุกขนาดหน้าจอจึงเป็นเรื่องยากลำบากมากในช่วงแรก แต่ ณ ปัจจุบันปัญหาเหล่านี้ก็ค่อยๆ ลดลงอย่างต่อเนื่องเพราะมีผู้คิดค้นเครื่องมือการพัฒนาเว็บแอพพลิเคชั่นทั้ง Framework, Library และออกแบบสถาปัตยกรรมที่เหมาะสมกับโมบายแอพพลิเคชั่นโดยเฉพาะ
แท้จริงแล้วหัวใจหลักของการพัฒนา API คือการใช้แนวคิดด้านสถาปัตยกรรมเชิงเซอร์วิส SOA (Service-Oriented Architecture) เพื่อประยุกต์ใช้ออกแบบที่จะดึงความสามารถศักยภาพให้เว็บแอพพลิเคชั่นสามารถตอบโจทย์ปัญหาในยุคที่ไคลเอนต์ (Client) ที่มีจำนวนมหาศาลและหลากหลาย หากวันนี้ถ้ายังคงใช้แนวคิดและวิธีการแบบเดิมๆ เชื่อว่าเว็บแอพพลิเคชั่นอย่าง Facebook คงยังไม่สามารถรองรับผู้ใช้งานมหาศาลจำนวนกว่าหนึ่งพันห้าร้อยล้านจากคนทั่วโลกได้
SOA จะถูกสร้างอยู่บนชั้นของเซอร์วิสในที่นี้คือ Application Service Layer ซึ่งเป็นที่รวมของฟังก์ชั่นการทำงานของระบบ และเซอร์วิสเหล่านั้นจะไม่มีการเชื่อมต่อกับส่วนแสดงผลโดยตรง นั้นแสดงว่าในส่วงของการแสดงผล (Presentation Layer) จะเป็นอะไรก็ได้ ไม่ว่าจะเป็นหน้าเว็บบน PC, iPhone App, Android App หรือ ระบบอื่นๆ ดังรูป ทำให้ระบบมีความยืดหยุ่นและสามารถขยายตัวได้อย่างสูง สามารถรองรับการโหลดของไคลเอนต์ ได้อย่างไม่จำกัดและมีประสิทธิภาพ เช่น การยกเอาชั้นเซอร์วิสไปรันไว้บนการประมวลผลแบบกลุ่มเมฆ (cloud) เพื่อให้เกิดการขยายตัวได้อย่างสูงสุด
ประเภทของเซอร์วิส
กล่าวมาถึงตรงนี้หลายท่านคงยังนึกภาพไม่ออก เพื่อให้เห็นภาพอย่างได้ชัดเจนมากยิ่งขึ้นขอยกตัวอย่าง เช่น ปกติแล้วถ้าเราต้องการสร้างเว็บไซต์ซักหนึ่งเว็บเพจ เพื่อให้คนทั่วไปได้อ่านและเข้าใจได้เราต้องใช้ภาษา HTML ในการสร้างและแสดงผลหน้าเว็บ แต่ถ้าเราต้องการสร้างเว็บเซอร์วิสเป้าหมายของเราจะไม่ใช่คนทั่วๆไปแล้ว แต่จะเปลี่ยนเป็นเครื่องคอมพิวเตอร์มาอ่านแล้วเข้าใจแทน ซึ่งต้องเปลี่ยนจาก HTML เป็นรูปแบบของ JSON หรือ XML แทน ที่เป็นรูปแบบของข้อมูลมาตรฐานเพื่อใช้แลกเปลี่ยนระหว่างกันของระบบคอมพิวเตอร์
นอกเหนือจากนักพัฒนาเว็บเซอร์วิสจะต้องมีความรู้ของรูปแบบของข้อมูล JSON หรือ XML แล้ว นักพัฒนาจะต้องมีความรู้ความเข้าใจศึกษาเรื่องรายละเอียดกระบวนการทำงานพื้นฐานของ HTTP ซึ่งเปรียบเสมือนตัวกลางที่ใช้สำหรับรับส่งข้อมูลของเว็บรีเควสต์ (Request) และเรสพอนต์ (Response) โดยเราจะอาศัยข้อมูลที่ถูกส่งซึ่งประกอบด้วยเมต้าเดต้าจำนวนมากมาใช้เป็นข้อมูลพื้นฐานในการสร้างออกแบบเว็บเซอร์วิส ได้แก่ รหัสสถานะของ HTTP, Header HTTP, คำสั่ง ของ HTTP เป็นต้น ซึ่งผมไม่ขอลงรายละเอียดสำหรับเรื่องนี้นะครับ
ประเภทของเว็บเซอร์วิสโปรโตดคอลที่ทำงานอยู่บน HTTP ที่ได้รับความนิยมปัจจุบัน ได้แก่
- RPC การทำงานจะเหมือนการเรียกใช้ฟังก์ชั่นและการส่งพารามิเตอร์ไปให้ตรงตามจำนวนที่เว็บเซอร์วิสต้องการ ซึ่งเราจะเห็นการทำงานของ RPC ในรูปแบบของ XML-RPC หรือ JSON-RPC
- SOAP (Simple Object Access Protocol) เป็นเซอร์วิสที่ต่อยอดมาจาก XML-RPC มีมาตรฐานการร่างเซอร์วิสที่เป็นทางการ ตัวเซอร์วิสของ SOAP จำเป็นต้องมี WSDL (Web Service Description Language) เพื่อใช้อธิบายฟังก์ชั่นการทำงานของเว็บเซอร์วิสนั้น ปัจจุบันโปรแกรมมิ่งหลายๆ ภาษาได้เตรียมไลบราบี่สำหรับการทำงานกับ SOAP เพื่ออำนวยความสะดวกไม่ให้มันใช้งานยากจนเกินไป
- REST (REpresentational Sate Transfer) มันเองไม่ใช่โปรโตคอล กล่าวได้ว่า REST เป็นเรื่องของหลักการออกแบบมากกว่า เพราะตัวมันเป็นอินเตอร์เฟส และพร้อมทั้งมีฟอร์แมตของข้อมูลตัวเอง (ในความเข้าใจของผม REST คือการประยุกต์ความรู้และต่อยอดความสามารถของ HTTP บวกความรู้การออกแบบเรื่อง Design Pattern โดยใช้รูปแบบข้อมูล JSON เป็นหลักในการดำเนินงาน) โดยที่ REST เองจะมีส่วนประกอบหลัก 2 ตัวคือ รีซอร์ส (Resource) และแอกชั่น (Action) ที่สามารถทำได้กับรีซอร์สนั้นๆ โดยแอกชั่นเหล่านั้นจะเกิดขึ้นได้ด้วยการส่งเวิร์บ (Verb) ที่ถูกต้องมาที่รีซอร์นั้นๆ
เทรนของการใช้เซอร์วิส ณ ปัจจุบัน รูปแบบเซอร์วิสด้วยแนวคิดแบบ REST เป็นที่นิยมอย่างกว้างขว้างนั้นคือ “RESTful Service” ด้วยเหตุผลเพราะด้วยความเรียบง่ายเรื่องกระบวนการทำงาน โดยใช้ความสามารถของ HTTP ซึ่งเป็นพื้นฐานของเทคโนโลยีเว็บซึ่งสามารถทำงานได้ทุกแพตฟอร์มอยู่แล้ว โดยตัว REST เองเป็นกระบวนการเปิดซอร์วิส CRUD (Create, Read*, Update, Delete) มีความสัมพันธ์กับข้อมูลที่แข็งแกร่งมาก จุดเด่นสำคัญในเรื่องของการออกแบบมาเพื่อให้ lightweight คือมีน้ำหนักเบา เหมาะที่จะถูกนำไปเป็นชั้นของเซอร์วิสในสถายปัตยกรรมเชิงเซอร์วิสเป็นอย่างมาก ทำให้การใช้ทรัพยากรและพลังงานของเครื่องแม่ข่ายน้อยมากเมื่อเปรียบกับแบบอื่น และรองรับการเรียกใช้งานของเครื่องลูกข่ายได้เป็นจำนวนมาก
สรุปสุดท้ายทำไมต้อง RESTful
สิ่งที่เหนือกว่าคือ url ที่สวยงาม การเรียกใช้งานเซอร์วิสสามารถทำผ่านได้ง่ายจาก URL สาเหตุที่ต้องใช้ URL เพราะใน RESTful จะมองข้อมูลที่ให้บริการเป็นรีซอร์ส (resource) เหมาะสมกับยุคของข้อมูลในปัจจุบันที่มีรูปแบบของข้อมูลที่หลากหลายโดยเฉพาะการเก็บข้อมูลลงในฐานข้อมูลแบบ NoSQL ซึ่งจะเรียกว่าคอลเล็กชั่น ตัวอย่างเช่น คอลเล็กชั่น user, product, order, category (ให้ลองศึกษาเรื่องของ NoSQL เพื่อให้เข้าใจยิ่งขึ้น)
ตัวอย่างการใช้งาน (ผลลัพท์จะเป็นรูปแบบข้อมูล JSON) เช่น
-ต้องการดึงข้อมูลของสินค้าทั้งหมด
http://exmaple.com/product/
-สำหรับรีซอร์สตัวใดตัวใดตัวหนึ่งที่จำเพาะเจาะจง เช่น ดึงข้อมูลของสินค้าที่มีรหัสลำดับที่ 72
http://exmaple.com/product/72
-และหากต้องการดึงอิลิเมนต์ย่อยภายใต้ตัวหลักออกมา เช่น ดึงข้อมูลของสินค้าที่มีรหัสลำดับที่ 72 และดูเฉพาะชื่อสินค้า
http://exmaple.com/product/72/name
ทั้งหมดนี้เป็นเรื่องราวส่วนหนึ่งของการพัฒนาเซอร์วิสแบบ RESTful ซึ่งยังมีรายละเอียดในส่วนอื่นๆ อีกมากมาย ซึ่งปัจจุบันมีนักพัฒนาได้สร้างเครื่องมือหรือที่เรียกว่า Framework สำหรับสร้าง RESTful ขึ้นมาโดยเฉพาะสามารถให้นำไปใช้งานกันได้อย่างสะดวกสบาย เช่น Slim Framework และมีตัวอื่นๆ อีกมากมายที่ได้รับความนิยม ลองค้นหาใน Google โดยใช้คำค้นว่า “Micro Framework” ตอนหน้าจะเป็นตัวอย่างการพัฒนา RESTful แบบง่ายๆ ด้วยภาษา PHP แต่ทั้งนี้ตัว RESTful เองสามารถพัฒนาได้หลากหลายภาษาที่ได้รับความนิยม ได้แก่ JavaScript, Python เป็นต้น รวมไปถึงหลักการพื้นฐานและการสร้างความปลอดภัยให้กับตัวเซอร์วิส RESTful ด้วยครับ 🙂
(*แหล่งข้อมูลเขียน Replace แต่จะประสบการณ์ของผู้เขียนน่าจะเป็น Read มากกว่า)
ข้อมูลอ้างอิง:
มิทเชลล์ ลอร์นา. เขียนโค้ค PHP อย่างมืออาชีพ. กรุงเทพฯ: ซีเอ็ดยูเคชั่น, 2556 (หน้า 91-140)