Web Service #1 : Introduction

    เรื่องนี้เป็นเรื่องใหม่ ซึ่งคาดว่าจะเปลี่ยนโฉมการเขียนโปรแกรมบน Web และการเขียนโปรแกรมแบบ Client/Server ไปเลย แต่เรื่องนี้ไม่ใช่แนวคิดใหม่เลยทีเดียว แนวคิดมันมีมานานแล้ว แต่ก็ไม่ได้เอามาประยุกต์ใช้อย่างจริงจัง ผมยกตัวอย่างให้ฟังตัวอย่างหนึ่งดีกว่า คือผมมีเครื่อง GPS อยู่ตัวหนึ่ง หลักการของ GPS มันก็ไม่มีอะไรมาก แค่โต้ตอบกับดาวเทียม เพื่อสามารถบอกตำแหน่งพิกัดของเราบนโลกได้ ซึ่งผมใช้มันเพื่อป้อนตำแหน่งพิกัดเข้าโปรแกรมแผนที่ดาวทำให้รู้ตำแหน่งดาวต่างๆ บนท้องฟ้า และควบคุมกล้องดูดาวให้หาสิ่งต่างๆ บนท้องฟ้าได้ แต่ตัว GPS มันทำกลับทำได้มากกว่านั้น แบบที่ผมไม่เคยนึกถึงเลย คือเมื่อผมเอาตัว GPS มาไว้ในรถ มันบอกสิ่งที่ผมคาดไม่ถึงเลยคือ ทิศที่รถกำลังจะไป และความเร็วปัจจุบันของรถ เป็นต้น ซึ่งมันคำนวณมาจาก ตำแหน่งพิกัดและเวลาที่เปลี่ยนไป เรื่องพวกนี้เป็นการประยุกต์ใช้ครับ เรื่องของ Web Service ก็เป็นลักษณะนี้เหมือนกันคือประยุกต์จาก technology ที่เคยมีมาก่อนอยู่แล้ว

    ก่อนที่เราเรียนรู้เรื่องของ Web Service เรามาลองดูแนวคิดเดิมที่เคยมีมาก่อนดีกว่า

    เรามาเริ่มต้นกันที่การที่เครื่องสองเครื่องเริ่มคุยกันได้โดยใช้ Protocol ที่ชื่อว่า TCP/IP ในเครื่องแต่ละเครื่องมี IP Address ไม่เหมือนกัน เสมือนเป็นหมายเลขโทรศัพท์ ในเครื่องคอมพิวเตอร์มีโปรแกรมอยู่หลายโปรแกรมที่ทำงานอยู่ เมื่อเราติดต่อไปยังเครื่องอื่นนั้น การที่เราระบุโปรแกรมที่เราต้องการติดต่อนั้น เราทำผ่านสิ่งหนึ่งที่เรียกว่า port ซึ่งเป็นเหมือนกับเบอร์ต่อภายใน เมื่อเรากำหนด IP และ port เรียบร้อยแล้ว เราก็สามารถติดต่อกับโปรแกรมที่เราต้องการติดต่อ แต่สิ่งที่เราต้องมีก็คือภาษาเฉพาะที่โปรแกรมทั้งสองข้างต้องคุยกันให้รู้เรื่อง เราเรียกว่า protocol เคยมีการคิดว่า port ที่มีให้ใช้กว่า 60,000 port นั้น ซักวันมันจะใช้ไม่พอ เพราะทุกๆ วันจะมีโปรแกรมใหม่ๆ ถูกสร้างขึ้นมา แต่เรื่องนี้จนวันนี้ก็ยังไม่เป็นจริงครับ เพราะมีการคิดค้น protocol ตัวหนึ่งที่ชื่อว่า http ซึ่งใช้ port 80 ก็คือ web นั้นเอง ซึ่ง web ก็ทำได้ค่อนข้างสมบูรณ์ เราไม่จำเป็นต้องคิดคน protocol ตัวใหม่ เราสามารถปรับปรุงจาก web ให้รองรับได้เกือบไม่มีขีดจำกัด

    วิธีการที่เราใช้เขียนโปรแกรมต่างๆ เช่น ftp, telnet หรือ web ทั้งหลายเหล่านี้ เราใช้สิ่งที่เราเรียกว่า Socket Programming ซึ่งผมคิดเอาว่าคุณๆ คงผ่านมาพอสมควร Socket นี้เป็นสิ่งที่ BSD Unix ซึ่งเป็นหนึ่งในสองของ Unix หลักเป็นผู้คิดค้นขึ้น และยังมีการใช้งานก็จนยุคปัจจุบัน ทางอีกค่ายของ AT&T ก็ไม่ยอมแพ้ครับคิดค้นเรื่อง Stream ออกมาแล้วออกมาเป็น Library ที่ชื่อว่า TLI ซึ่งมีใน System V R3 เป็นรุ่นแรก แต่ผมก็ไม่เห็น application ใช้มากเท่าไรนัก

    ทาง BSD ก็แก้ลำโดยการออก การเขียนโปรแกรมแบบ Client/Server แบบใหม่ที่ชื่อว่า Remote Procedure Call (RPC) ซึ่งโปรแกรมเมอร์ส่วนมากไม่ได้ใช้ แต่ในตัว OS เองใช้เยอะมาก เช่น NFS เป็นต้น หลักการก็คือ แทนที่จะแยกโปรแกรมเป็นสองส่วนออกจากกันแท้ๆ เป็นส่วนของ Client และ Server ซึ่งต้องกำหนดภาษาเฉพาะเอาไว้คุยกัน แนวคิดของ Sun RPC คือพยายามให้โปรแกรมดูเหมือนเป็นโปรแกรมเดียว และเมื่อแยกส่วนของโปรแกรมไปไว้ในส่วนของ Server การที่ client เข้าไปเรียกใช้ จะเหมือนกับการ call Procedure ธรรมดา นั่นแหละครับเป็นต้นของคำว่า Remote Procedure Call คือการเรียกใช้ procedure ที่ไม่ได้อยู่มันเครื่องของเรา แต่นั่นก็เป็นแค่ความฝันครับ เพราะการส่ง parameter ไปยัง server นั้นมีข้อจำกัดมาก ทำให้ยุ่งยากมาก ต้องสร้าง prototype ของชนิดตัวแปรที่แปลกๆ แยกต่างหาก และต้องมีการแปลเป็น C source code ก่อนถึงจะทำงานได้ ซึ่งขั้นตอนเยอะมาก และมีข้อจำกัดมากเช่นกัน นั่นเป็นปัญหาแรก ส่วนปัญหาที่สอง code ในส่วนที่เป็น client และ code ที่อยู่ที่ server นั้นมักมาจากทีมงานการเขียนโปรแกรมทีมเดียวกัน procedure ที่อยู่ในส่วนของ Server นั้นเป็นเป็นสาธารณะไม่ได้ง่ายนัก เพราะไม่มีวิธีที่เหมาะสมในการ document ว่า Server นี้มี procedure อะไรให้ใช้บ้าง และถึงจะมี document ก็ต้องส่ง file พิเศษกำหนด prototype ของชนิดตัวแปรต่างๆ ดังที่ได้กล่าวมาข้างบน

    เรามาดูอีกมุมหนึ่ง คือมุมของ Web ถ้าใครเคยเขียน Web Application ก็คงจะรู้ดีว่า ปัญหาหลักข้อหนึ่งของการพัฒนา Software บน web ก็คือการส่งข้อมูลไปกลับระหว่าง Browser และ Web Server และยิ่งไปกว่านั้น การที่ Web Server เองจะแลกเปลี่ยนข้อมูลกันก็เป็นเรื่องที่ยุ่งมาก แต่ปัญหาที่กล่าวมาทั้งหมดกำลังจะหมดไป ด้วย Web Service

Web Service คืออะไร

    Web Service คือ Remote Procedure Call นั่นเอง แต่ Microsoft ได้ปรับปรุงอะไรหลายอย่างจนได้อย่างใจ เรามาดูกันว่า Microsoft ทำอะไรบ้าง

 IIS เป็นตัวเก็บ Server Code

    Microsoft เลือกที่ไม่สร้าง Protocol ตัวใหม่ในการจัดการ Web Service แต่ใช้สิ่งที่มีอยู่แล้วคือ Web นั่นเอง นั่นหมายความว่า Microsoft ไม่ต้องสร้าง Server พิเศษ เพื่อเก็บ object ที่อยู่บนฝั่ง Server ทาง Microsoft ใช้ Web Server ของตัวเองที่ชื่อว่า Internet Information Server (IIS) เพื่อเก็บ code ฝั่ง Server ข้อดีของการทำเช่นนี้คือ ไม่ต้องปรับอะไรใหม่เลย และ เราสามารถใช้ Browser เพื่อ ดูรายการว่า Server ตัวนี้มี procedure อะไรให้ใช้บ้าง ข้อมูลนี้เป็น document ในตัวนะครับ มีวิธีใช้เสร็จสรรพ เหมือนใน Reference Manual เลย

การส่งผ่าน parameter แทบไม่มีขีดจำกัด

    การรับส่ง parameter ระหว่าง Client และ Server เราเรียกว่าเป็นการ Marshall ข้อมูล ในข้อนี้แก้ปัญหาของ Sun RPC ครับ ที่มีข้อจำกัดชนิดตัวแปรที่ส่งได้ แต่สำหรับ Web Service นั้นการส่งข้อมูลเป็นไปอย่างธรรมชาติมากแทบไม่มีขีดจำกัดเลย Microsoft ใช้ ADO.Net เข้ามาช่วยทำให้เราสามารถรับส่งข้อมูลไม่เพียงแต่พวก Integer หรือ String เท่านั้น เราสามารถรับส่ง Table ทั้ง Table หรือแม้กระทั่ง Database ทั้ง Database โดยง่ายมาก programmer ไม่รู้สึกถึงความแตกต่างในการส่ง Integer หรือ Database ทั้งลูกเลย

ไม่กลัว Firewall

    อย่างที่กล่าวมา Web Service นั้นไม่ได้ใช้ Port พิเศษเลย ใช้เพียง port 80 ซึ่งเป็น port Web ธรรมดา Protocol ที่ใช้ก็เป็นมาตรฐานคือ HTTP และ XML ทำให้สามารถทะลุ Firewall ได้ Microsoft ใช้ Protocol มาตรฐานอีกตัวคือ SOAP ในการส่ง parameter ต่างๆ ซึ่ง SOAP ก็ไปเรียกใช้ XML อีกที เรื่องนี้คุณไม่จำเป็นต้องรู้ก็ได้ เพราะมันเป็นเรื่องภายในเวลารับส่งข้อมูล ดังนั้นไม่ต้องกลัวครับ เราสามารถใช้ Web Service โดยที่ไม่จำเป็นต้องรู้เรื่อง XML และ SOAP เลย หรือแม้แต่ HTTP ก็ไม่จำเป็นต้องรู้ด้วยซ้ำไป

 Overhead ในการเขียนโปรแกรมต่ำ

     หลักการในการเขียนโปรแกรมฝั่ง Server นั้น เป็นแบบที่เราคุ้นเคยอยู่แล้วคือ เป็น class มี syntax เพิ่มนิดเดียวตรงที่บอกว่า method ดังกล่าวเป็น Web Method และ Header อีกหนึ่งบรรทัดเพื่อบอกว่า file นี้เป็น Web Service เท่านั้นแหละครับ file นี้มีนามสกุล .asmx ก็อย่างที่ทราบ มันแทบจะเหมือน file .cs หรือ .vb เลยที่เดียว จากนั้นเวลาเราเขียน client อาจจะดูยุ่งยากในการเขียน code ซึ่งมันก็ยังยุ่งจริงๆ แต่ทาง Microsoft มีเครื่องมือตัวหนึ่งที่ชื่อว่า webserviceutil เพื่อติดต่อไปยัง web server แล้วทำการสร้าง proxy class ภาษาต่างๆ แล้วแต่เราจะระบุจาก .asmx ที่เราระบุ ซึ่ง proxy class นั้นเป็น class ที่เหมือนกับ class ใน .asmx แต่ไม่ code ภายในจริง มีแต่ส่วนติดต่อไปยัง web server ซึ่งเราไม่ต้องเขียนส่วนติดต่อนี้เอง webserviceutil จะสร้าง code ให้เรา เราก็มอง proxy class เสมือนกับเป็น class ปกติ ใช้งานง่ายมากครับ

ใครๆ ก็เรียกใช้ Web Service ได้

    Web Service ใช้ได้กับ Web Application โดยที่ ASP.Net ซึ่งเป็น ASP รุ่นใหม่ของ Microsoft รองรับเรื่องนี้อย่างเต็มที่ แต่ก็ไม่เท่านั้นนะครับ Application ที่เราใช้ Winforms หรือแม้แต่ Console Application ก็สามารถเรียกใช้ Web Service ได้ครับ แม้กระทั่ง Application ในส่วนที่เป็น Client ที่ไม่ได้เขียนบน .Net Framework เช่น VB6 ก็เรียกใช้ได้เช่นกันครับ

Web Server คุยกับ WebS Server

    เรื่องนี้ Microsoft และ Sun แย่งกันชิงตลาดแนวคิดใหม่นี้ แทนที่เราจะเอา Browser ต่อเข้ากับ Web Server ปรกติ ทั้งสองบริษัทกำลังวางโครงสร้างพื้นฐานให้ Web Server ต่างๆ คุยกันเองได้ เช่นเรา web ของเราอาจจะดึงข้อมูลดิบของตลาดหุ้นเอามากรอง แล้ววาดเป็น graph เพื่อส่งให้ browser เป็นต้น เราเห็นอาวุธนี้ของ Microsoft แล้วคือทำด้วย Web Service แต่ส่วนของ Sun นั้นผมยังไม่รู้ครับ