450 likes | 740 Views
3SA07: Web Services I. อ.สันติชัย ช่วยวงศ์. suntichai@coe.psu.ac.th. Outline. Web Services สถาปัตยกรรมของ Web Service การใช้งาน Web Service ในการทดลองนี้ Java API for XML Web Services (JAX-WS) การพัฒนา Web Service Client โดยใช้ JAX-WS
E N D
3SA07: Web Services I อ.สันติชัย ช่วยวงศ์ suntichai@coe.psu.ac.th
Outline • Web Services • สถาปัตยกรรมของ Web Service • การใช้งาน Web Service ในการทดลองนี้ • Java API for XML Web Services (JAX-WS) • การพัฒนา Web Service Client โดยใช้ JAX-WS • การใช้ NetBeans ในการพัฒนา Web Service Client ด้วย JAX-WS • การพัฒนา Web Service Client ใน Web Application • แหล่งข้อมูลเพิ่มเติม
Web Services • Web Service คือ โปรแกรมชนิดหนึ่งที่สามารถเรียกใช้ได้จากเครื่องคอมพิวเตอร์เครื่องอื่น • Web Service เปรียบเหมือนฟังก์ชันหรือเมธอด ที่สามารถเรียกใช้ได้จากคอมพิวเตอร์เครื่องอื่น • Web Service Client สามารถเรียกเมธอดได้โดยการส่ง request message ซึ่งใช้โปรโตคอล SOAP ไปยังเครื่องเปิดบริการ Web Service • Web Service Client อาจจะเป็น application ที่พัฒนาด้วยภาษาใดก็ได้ หรืออาจจะเป็น web application ก็ได้ • เนื่องจากใช้มาตรฐานเดียวกัน • ตัวอย่างของ Web Service ได้แก่ Web Service สำหรับสอบถามราคาน้ำมัน, Web Service สำหรับการค้นหาข้อมูลต่างๆ เป็นต้น
Simple Object Access Protocol (SOAP) • SOAP เป็นโปรโตคอลที่ Web Service Client ใช้ในการเรียกใช้และรับผลลัพธ์จาก Web Service • Request message เปรียบเหมือน message ที่ใช้ในการเรียกเมธอด (Web Service) • Response message ใช้ในการบรรจุผลลัพธ์ของ Web Service หรือเปรียบเหมือนค่าที่ return จากการเรียกเมธอด • SOAP ทำงานอยู่เหนือโปรโตคอล HTTP (เป็นส่วนใหญ่) • Request และ response message จะอยู่ในรูปของเอกสาร XML
ประโยชน์ของ Web Services • ช่วยให้ผู้พัฒนา application หรือ web application สามารถเพิ่มความสามารถให้กับโปรแกรมได้อย่างรวดเร็ว • เนื่องจากสามารถเรียกใช้ Web Service โดยการส่ง input และรอรับ output โดยไม่จำเป็นต้องรู้หลักการทำงานของ Web Service แต่ละตัว • Web Service ได้ถูกกำหนดเป็นมาตรฐาน ทำให้ application ที่เป็น client ไม่จำเป็นต้องพัฒนาด้วยภาษาเดียวกันกับ Web Service
สถาปัตยกรรมของ Web Services (อย่างง่าย)
WSDL • WSDL ย่อมาจาก Web Services Description Language • เป็นภาษาที่ใช้พื้นฐานมาจาก XML • WSDL ใช้ในการให้คำอธิบาย Web Service • ที่อยู่ของ Web Service หรือที่เรียกว่า Universal Resource Indicator (URI) • ชื่อเมธอด, ชนิดของ input และ output parameter • และรายละเอียดอื่นๆ
WSDL(ต่อ) • ผู้ที่พัฒนา Web Service จะต้องเตรียมไฟล์ WSDL เพื่ออธิบาย Web Service แต่ละตัว • ผู้ที่พัฒนา Web Service Client สามารถอ่านคำอธิบายในไฟล์ WSDL ดังกล่าวและสามารถเรียกใช้ Web Service ได้อย่างถูกต้อง • กระบวนการที่ client เรียกใช้ (call) Web Service เรียกอีกอย่างหนึ่งว่า กระบวนการ Bind
UDDI • Universal Description Discovery and Integration • UDDI เป็นเหมือนที่เก็บข้อมูลของ Web Service • UDDI จะกำหนดวิธีการ publish และค้นหา (find) Web Service ต่างๆ • ในการทดลองนี้จะยังไม่กล่าวถึง UDDI
การใช้งาน Web Services ในการทดลองนี้ • พัฒนา Web Service Client ที่สามารถเรียกใช้ Web Services ที่เปิดให้บริการอยู่ใน Internet ได้ • รู้ที่อยู่ของไฟล์ WSDL ของ Web Service ที่ต้องการเรียกแล้ว • ยังไม่กล่าวถึง UDDI เนื่องจากยังไม่มีการค้นหา Web Service • ยังไม่มีการสร้างและเปิดให้บริการ Web Service • สามารถพัฒนา Web Service Client ได้ทั้งใน Java application และ web application
ขั้นตอนการพัฒนา Web Service Client • ศึกษารายละเอียดของ Web Service จากไฟล์ WSDL • ดาวน์โหลดจากเว็บไซต์ของผู้ให้บริการ Web Service • สร้าง SOAP request message • กำหนดชื่อเมธอด และค่า input parameter • เรียกเมธอดโดยการส่ง request message ไปยัง server ที่ให้บริการ Web Service • ที่อยู่ของ Web Service ดูได้จาก URI ที่ระบุไว้ในไฟล์ WSDL
Java API for XML Web Services (JAX-WS) • JAX-WS เป็น Java API ที่ช่วยอำนวยความสะดวกในการสร้าง, เปิดให้บริการ และเรียกใช้ Web Service • การแปลงระหว่างไฟล์ WSDL กับ Java class • การสร้างและแปลความหมายของ SOAP message • การรรับและส่ง SOAP message • ช่วยให้ผู้พัฒนาโปรแกรมสามารถเรียกใช้ Web Service ได้เหมือนกับการเรียกเมธอดทั่วไป
การติดตั้ง JAX-WS • ในกรณีที่ใช้ JDK 6.0 ไม่ต้องติดตั้งเพิ่มเนื่องจาก JAX-WS เป็น API ที่มีอยู่ใน JDK 6.0 อยู่แล้ว • สำหรับ JDK เวอร์ชัน 5.0 ให้ดาวน์โหลดไฟล์ติดตั้งได้ที่ URL https://jax-ws.dev.java.net/ • เวอร์ชันล่าสุด (22 ม.ค. 51) คือเวอร์ชัน 2.1.3 • ไฟล์ติดตั้งคือไฟล์ JAXWS2.1.3-20071218.jar • รันไฟล์ติดตั้งด้วยคำสั่ง java -jar JAXWS2.1.3-20071218.jar
การติดตั้ง JAX-WS(ต่อ) • จะได้ไดเรกทอรีชื่อ jaxws-ri • Copy ไฟล์ .jar ทุกไฟล์ที่อยู่ในไดเรกทอรี jaxws-ri/lib ไปไว้ในไดเรกทอรี %JAVA_HOME%/jre/lib/ext • เพื่อให้คำสั่ง javac หรือ java รู้จักคลาสต่างๆ ของ JAX-WS • เพิ่มตัวแปรของระบบชื่อ JAXWS_HOME โดยกำหนดให้ชี้มาที่ไดเรกทอรี jaxws-ri (ใส่ path เต็ม) • เพิ่มไดเรกทอรี jaxws-ri/bin (ใส่ path เต็ม) ลงในตัวแปรของระบบที่ชื่อ PATH เพื่อให้สามารถเรียกใช้ bat file ที่อยู่ในไดเรกทอรีนี้ได้ (wsimport.bat, wsgen.bat)
ขั้นตอนการพัฒนา Web Service Client โดยใช้ JAX-WS • ดาวน์โหลดไฟล์ WDSL ของ Web Service ที่ต้องการจะเรียก หรืออาจจะใช้เพียงแค่ URL ของไฟล์ดังกล่าวโดยไม่ต้องดาวน์โหลดก็ได้ • ใช้คำสั่ง wsimport (เป็น bat file ของ JAX-WS) ในการสร้าง Java class ที่เป็นตัวแทนของ Web Service ที่ต้องการจะเรียก • โดยใช้ข้อมูลจากไฟล์ WSDL ข้างต้น • เขียน Java application หรือ web application ที่เรียกเมธอดของคลาสที่เป็นตัวแทนของ Web Service • เรียกเมธอดเหมือนกับการเขียนโปรแกรมปกติ
ตัวอย่างการพัฒนา Web Service Client • ตัวอย่างนี้เป็นการพัฒนา Web Service Client ที่เป็น Java application • Web Service ที่ต้องการเรียกเป็น Web Service ที่ใช้ในการตรวจสอบหมายเลข IP address และบอกได้ว่า IP address ดังกล่าวเป็นของโฮสต์ที่อยู่ในประเทศใด • ดาวน์โหลดไฟล์ WSDL ได้ที่ URL ต่อไปนี้ http://www.webservicex.net/geoipservice.asmx?WSDL
รายละเอียดของ Web Service ที่ระบุไว้ในไฟล์ WSDL(ต่อ) • Service Name: GeoIPService • Service นี้มี port ที่ใช้โปรโตคอล SOAP จำนวน 1 port และมีชื่อว่า GeoIPServiceSoap • port เป็นเหมือนจุดที่ใช้ในการเข้าถึง web service ซึ่งจะมีการระบุ address ของ service เอาไว้ • Port ที่ชื่อ GeoIPServiceSoap มี operation (method) ให้เรียกใช้ได้จำนวน 2 เมธอดคือ GetGeoIPContext และ GetGeoIP
รายละเอียดของ Web Service ที่ระบุไว้ในไฟล์ WSDL • เมธอดที่เราสนใจในที่นี้คือเมธอด GetGeoIP ซึ่งสามารถตรวจสอบได้ว่า IP address ที่กำหนดอยู่ในประเทศใด • ดูความสามารถของแต่ละ operation ได้จาก web site เจ้าของ Web Service หรือดูได้จากไฟล์ WSDL
การสร้าง class ที่เป็นตัวแทนของ Web Service • ใช้คำสั่ง wsimport โดยใช้รูปแบบดังนี้ (พิมพ์ในบรรทัดเดียวกัน) wsimport <URL ของไฟล์ WSDL> -p <ชื่อแพ็กเก็จ> • ในกรณีที่ดาวน์โหลดไฟล์ WSDL มาไว้ในเครื่องแล้ว สามารถใส่ path ของไฟล์ แทน URL ได้ • ตัวอย่างเช่น wsimport http://www.webservicex.net/geoipservice.asmx?WSDL –p ws.ipgeo • คำสั่ง import จะสร้างไฟล์ .java และคอมไพล์ ไฟล์ .class ทั้งหมดจะถูกเก็บไว้ในไดเรกทอรี ws.ipgeo ส่วนไฟล์ .java จะถูกลบ
การสร้าง class ที่เป็นตัวแทนของ Web Service (ต่อ) • หากต้องการเก็บ source code (ไฟล์ .java) ให้เพิ่ม option ต่อไปนี้ -keep –s <ชื่อไดเรกทอรีสำหรับเก็บ source code> • ตัวอย่างเช่น wsimport http://www.webservicex.net/geoipservice.asmx?WSDL –p ws.ipgeo –keep –s ws_src • ไฟล์ .java จะถูกนำไปวางไว้ในไดเรกทอรี ws_src ซึ่งผู้พัฒนาโปรแกรมสามารถใช้ในการศึกษาวิธีการเรียกใช้คลาสต่างๆ ได้
คลาสที่ถูก generate โดยคำสั่ง wsimport • class หรือ interface ที่ถูก generate โดยคำสั่ง wsimport จะมีการใช้ annotationจำนวนมากเพื่อกำหนดค่าของพารามิเตอร์ต่างๆ ในการติดต่อตามมาตรฐานของ Web Service • Annotation จะมีเครื่องหมาย @ นำหน้า ซึ่งจะถูกเรียกใช้โดย class ของ JAX-WS • ในการอ่าน code เบื้องต้น ให้นักศึกษาปิด code ที่เป็น annotation และพิจารณาเฉพาะ Java code เท่านั้น จะช่วยให้เข้าใจได้ง่ายขึ้น • Service class เป็นคลาสที่มีชื่อเดียวกับ service name ที่ระบุไว้ในไฟล์ WSDL ในตัวอย่างนี้คือคลาส GeoIPService • Port interface เป็น interface ที่มีชื่อเดียวกับ Port ซึ่งในตัวอย่างนี้คือ interface ชื่อ GeoIPServiceSoap
Service Class • Service class ประกอบด้วย constructor และ method สำหรับอ่าน reference ไปยัง endpoint object public class GeoIPService extends Service { private final static URL GEOIPSERVICE_WSDL_LOCATION; private final static Logger logger = Logger.getLogger(ws.ipgeo.GeoIPService.class.getName()); public GeoIPService(URL wsdlLocation, QName serviceName){ //.. } public GeoIPService() { //... } public GeoIPServiceSoap getGeoIPServiceSoap(){ //... } public GeoIPServiceSoap getGeoIPServiceSoap (WebServiceFeature... features) { //... } }
Port Interface • Port Interface มีเมธอดที่เป็นชื่อเดียวกับ operation ที่ระบุไว้ในไฟล์ WSDL public interface GeoIPServiceSoap { public GeoIP getGeoIPContext(); public GeoIP getGeoIP(String ipAddress); } • ทั้งสองเมธอดมีการ return ค่าเป็นชนิด GeoIP • ดูรายละเอียดเพิ่มเติมจากคลาส GeoIP ว่าผลลัพธ์ของ operation นี้มีรายละเอียดอะไรบ้าง • เป็นรายละเอียดเกี่ยวกับประเทศที่เป็นที่ตั้งของ IP address ที่ต้องการตรวจสอบ
ขั้นตอนการเขียนโปรแกรมเพื่อเรียกใช้ service class • Copy ไดเรกทอรีที่ generate ด้วย wsimport (ส่วนที่แพ็กเกจของไฟล์ .class) ไปวางในไดเรกทอรีที่จะเขียนโปรแกรม • ในตัวอย่างนี้คือไดเรกทอรี ws • import คลาสต่างๆ ในแพ็กเกจดังกล่าว import ws.ipgeo.*; • สร้าง object ของ service class GeoIPService service = new GeoIPService(); • อ่านค่า reference ของ port object GeoIPServiceSoap port; port = service.getGeoIPServiceSoap();
ขั้นตอนการเขียนโปรแกรมเพื่อเรียกใช้ service class(ต่อ) • เรียกใช้เมธอดที่ต้องการผ่าน endpoint object String ipAddr = "158.108.216.5"; GeoIP result = port.getGeoIP(ipAddr); • นำค่าที่ return ไปดำเนินการต่อหรือนำไปแสดงผล • คำแนะนำ • ควรใช้ try-catch กับ code ที่มีการเรียกใช้ Web Service เพื่อป้องกันข้อผิดพลาด เช่น ข้อผิดพลาดเกี่ยวกับระบบเครือข่าย เป็นต้น
IpGeoClient.java import ws.ipgeo.*; public class IpGeoClient { public static void main(String[] args) { GeoIPService service = new GeoIPService(); GeoIPServiceSoap port = service.getGeoIPServiceSoap(); //Lookup IP address of the web server of Kasetsart University String ipAddr = "158.108.216.5"; GeoIP result = port.getGeoIP(ipAddr); //Display result (country information) String ctName = result.getCountryName(); String ctCode = result.getCountryCode(); System.out.println("IP Address: " + ipAddr); System.out.println("Country: " + ctName + ", code: " + ctCode); //Lookup IP address of the web server of the Universityof Tokyo ipAddr = "133.11.128.254"; result = port.getGeoIP(ipAddr); System.out.println("\nIP Address: " + ipAddr); System.out.println("Country: " + result.getCountryName() + ", code: " + result.getCountryCode()); } }
การสื่อสารระหว่าง Client และ Server String ipAddr = "158.108.216.5"; GeoIP result = port.getGeoIP(ipAddr);
การสื่อสารระหว่าง Client และ Server (ต่อ) String ipAddr = "158.108.216.5"; GeoIP result = port.getGeoIP(ipAddr);
การสื่อสารระหว่าง Client และ Server (ต่อ) String ipAddr = "133.11.128.254"; GeoIP result = port.getGeoIP(ipAddr);
การสื่อสารระหว่าง Client และ Server (ต่อ) String ipAddr = "133.11.128.254"; GeoIP result = port.getGeoIP(ipAddr);
การใช้ NetBeans ในการพัฒนา Web Service Client ด้วย JAX-WS • NetBeans มี JAX-WS อยู่ภายในอยู่แล้ว • NetBeans 5.5 ใช้ JAX-WS เวอร์ชัน 2.0 • NetBeans ช่วยอำนวยความสะดวก generate คลาสจากไฟล์ WSDL และการสร้าง code สำหรับ Web Service Client อย่างง่าย • เมื่อต้องการใช้ NetBeans ต้องย้ายไฟล์ .jar ของ JAX-WS เวอร์ชัน 2.1.3 ออกจาก %JAVA_HOME%/jre/lib/ext ก่อน • เพื่อไม่ให้ NetBeans ไปใช้ไฟล์ .jar ดังกล่าว ซึ่งจะเกิดปัญหาตอน build project ได้ • ไฟล์ที่ต้องย้ายออกมาคือไฟล์ jaxws-tools.jar • ทางที่ดีควรย้ายไฟล์ .jar ของ JAX-WS ออกทุกไฟล์
ขั้นตอนการสร้าง Web Service Client ด้วย NetBeans • สร้าง Project ใหม่ ในที่นี้เป็นการสร้าง Java application ชื่อ wsclient • สร้าง Java class และกำหนดให้มีเมธอด main ในคลาสนี้ด้วย • ในที่นี้ตั้งชื่อว่า IpGeoClient.java • เตรียมข้อมูลสำหรับการทำ web service client โดยคลิกขวาที่ชื่อ project แล้วเลือก New Web Service Client
ขั้นตอนการสร้าง Web Service Client ด้วย NetBeans(ต่อ) • ในหน้าต่าง New Web Service Client • กำหนด URL ของไฟล์ WSDL (ในกรณีที่มีไฟล์ในเครื่องอยู่แล้ว ให้กด browse ในช่อง Local File) • ตั้งชื่อ package เพื่อเป็นที่เก็บคลาสที่ถูก generate • เมื่อกดปุ่ม Finish, NetBeans จะเรียกคำสั่ง wsimport และ generate คลาสต่างๆ จากไฟล์ WSDL ที่กำหนด รวมถึง compile คลาสที่ได้ generate ขึ้น • ดู source code ของไฟล์เหล่านี้ได้ในไดเรกทอรี build/generated/wsimport/client
ขั้นตอนการสร้าง Web Service Client ด้วย NetBeans(ต่อ) • NetBeans สามารถ generate code ในการเรียก service class อย่างง่ายได้ • การสร้าง service object, port object และการเรียกเมธอดเพื่อเรียก Web Service • ที่หน้าต่าง project เลือกโหนด Web Service References และเลือก operation ที่ต้องการ จากนั้น drag เมาส์มาวางในพื้นที่สำหรับพิมพ์ source code • หลังจากนั้นสามารถปรับแต่ง source code ได้ตามต้องการ
การ generate code ที่ใช้ในการเรียกใช้ service class
การสร้าง Web Service Client ใน Web Application • เช่น การใช้ servlet ทำหน้าที่เป็น Web Service Client • ใช้วิธีการเดียวกับ Java Application • ต่างกันที่การ build project จะมีการนำไฟล์ .jar ของ JAX-WS (ที่จำเป็นต้องใช้เมื่อมีการเรียก service class) ใส่ลงในไดเรกทอรี WEB-INF/lib ของ web application ด้วย
แหล่งข้อมูลเพิ่มเติม • Web Services Tutorial • http://www.javapassion.com/webservices/index.html • JAX-WS • https://jax-ws.dev.java.net/ • NetBeans tutorial on Web Services • http://www.netbeans.org/kb/55/websvc-jax-ws.html • แหล่งรวม Web Service • http://www.webservicex.net/WCF/webServices.aspx