ในบทความนี้ ฉันจะพูดถึงไฟล์ WSDL คืออะไร เหตุใดจึงจำเป็น และวิธีการทำงานกับไฟล์ดังกล่าว
แผนที่บทความ
WSDL คืออะไร
WSDL เป็นภาษาคำอธิบายบริการเว็บที่มีโครงสร้าง XML วัตถุประสงค์หลักของไฟล์ WSDL คืออินเทอร์เฟซสำหรับการเข้าถึงฟังก์ชันบริการและส่งคืนประเภทข้อมูล เส้นทางไปยังเซิร์ฟเวอร์ที่ประมวลผลคำขอ ฯลฯ
เส้นทางไปยังไฟล์ wsdl มักจะมีลักษณะดังนี้ http://host/services/wsdl/gbdar-v2-2.wsdl
มีเครื่องมือ ไลบรารีมากมายที่ออกแบบมาเพื่ออ่านไฟล์ WSDL
สบู่อุ้ย
เครื่องมือหนึ่งคือsoapUi() ด้วยการติดตั้งการแจกจ่ายที่ออกแบบมาสำหรับแพลตฟอร์มของคุณ คุณสามารถสร้างได้ โครงการใหม่โดยทีมงานโครงการ File/New SoapUi ในกล่องโต้ตอบสำหรับการสร้างโปรเจ็กต์ใหม่ ให้เปิดใช้ช่องทำเครื่องหมายสร้างคำขอตัวอย่างทิ้งไว้
ดำเนินการสอบถาม
ในโปรเจ็กต์ใหม่ เทมเพลตคำขอจะถูกสร้างขึ้นโดยอัตโนมัติสำหรับบริการ ซึ่งมีคำอธิบายอยู่ในไฟล์ wsdl ทางด้านซ้ายในแผนผัง คุณจะเห็นรายการฟังก์ชันที่มีอยู่ในไฟล์ WSDL ฉันจะเปิดเผยฟังก์ชันการจำลองแบบ ข้างในนั้นมีคำขอ Request1 ดับเบิลคลิกซึ่งเราจะเห็นกล่องโต้ตอบพร้อมเทมเพลตคำขอ แทนที่จะเป็นพารามิเตอร์เริ่มต้นจะมีเครื่องหมายคำถาม เพื่อให้ฟังก์ชันทำงานได้อย่างถูกต้อง คุณต้องกรอกพารามิเตอร์ทั้งหมดที่ไม่มีแท็กตัวเลือก จากนั้นคลิกสามเหลี่ยมสีเขียวที่มุมซ้ายบนของกล่องโต้ตอบ
หากระบุพารามิเตอร์ทั้งหมดอย่างถูกต้อง การตอบสนองของบริการต่อคำขอจะปรากฏทางด้านขวา
SoapUi ให้ความสามารถในการดูพารามิเตอร์ของไฟล์ WSDL ในการดำเนินการนี้คุณต้องดับเบิลคลิกที่ชื่ออินเทอร์เฟซ (ทำเครื่องหมายด้วยไอคอนสีเขียวในแผนผังไฟล์ WSDL สำหรับฉัน - gdbar-v2-2SOAP) ในกล่องโต้ตอบ คุณจะพบ:
- แท็บภาพรวม - คำอธิบาย พารามิเตอร์ทั่วไป WSDL รายการฟังก์ชันและการดำเนินการของเซิร์ฟเวอร์ที่เกี่ยวข้อง
- แท็บปลายทางบริการ — เส้นทางไปยังเซิร์ฟเวอร์และพารามิเตอร์อื่น ๆ
- เนื้อหา WSDL - แผนผังการนำทางไฟล์
- การปฏิบัติตาม WS-I — ที่นี่คุณสามารถสร้างรายงาน WS-I บนอินเทอร์เฟซได้
การสร้างเอกสาร
SoapUi ช่วยให้เราสามารถสร้างเอกสารประกอบฟังก์ชัน WSDL โดยคลิก คลิกขวาผ่านอินเทอร์เฟซและเรียกคำสั่ง สร้างเอกสารด้วยเหตุนี้เราจึงจะได้รับคู่มือโดยละเอียดในรูปแบบ html
เพียงเท่านี้ สมัครรับโพสต์ใหม่ แสดงความคิดเห็น ให้คำแนะนำในการปรับปรุงบทความ
บริการเว็บแต่ละรายการมีเอกสาร WSDL (ภาษาคำอธิบายบริการเว็บ) ที่อธิบายทุกสิ่งที่ไคลเอนต์จำเป็นต้องใช้ในการทำงานกับบริการนั้น เอกสาร WSDL มอบวิธีที่ง่ายและสม่ำเสมอสำหรับนักพัฒนาในการระบุไวยากรณ์สำหรับการเรียกวิธีเว็บใดๆ นอกจากนี้ เอกสารนี้ยังอนุญาตให้ใช้เครื่องมือสร้างคลาสพร็อกซีอัตโนมัติที่คล้ายกับเครื่องมือที่รวมอยู่ในเฟรมเวิร์ก วิชวลสตูดิโอ.NET และ .NET Framework ด้วยเครื่องมือเหล่านี้ การใช้บริการเว็บจึงเป็นเรื่องง่ายเหมือนกับการใช้คลาสท้องถิ่น
เอกสาร WSDL ขึ้นอยู่กับ รูปแบบ XMLโดยแบ่งข้อมูลออกเป็น 5 กลุ่ม สามกลุ่มแรกเป็นคำจำกัดความเชิงนามธรรมที่ไม่ขึ้นอยู่กับแพลตฟอร์ม เครือข่าย หรือภาษาเฉพาะ ในขณะที่อีกสองกลุ่มที่เหลือมีคำอธิบายที่เป็นรูปธรรม
โปรโตคอลสบู่
การสื่อสารระหว่างบริการเว็บและลูกค้าจะดำเนินการผ่านข้อความในรูปแบบ XML
SOAP (Simple Object Access Protocol) เป็นโปรโตคอลข้อความสำหรับเลือกบริการเว็บ
แนวคิดหลักของมาตรฐาน SOAP คือข้อความควรเข้ารหัสในรูปแบบ XML ที่เป็นมาตรฐาน
นอกจากข้อความ SOAP แล้ว คุณยังสามารถใช้ GET และ โปรโตคอลโพสต์ HTTP
ข้อดีของการใช้รูปแบบ SOAP เหนือรูปแบบอื่นๆ สำหรับการถ่ายโอนข้อมูล:
การเข้ารหัสโครงสร้างข้อมูลและชุดข้อมูลใน XML โดยใช้ SOAP นั้นง่ายดายพอๆ กับการเข้ารหัสประเภทข้อมูลสเกลาร์แบบธรรมดา
เมื่อใช้ข้อความ SOAP เครื่องมือเพิ่มเติมซึ่งช่วยให้คุณสามารถเพิ่มคุณลักษณะการรักษาความปลอดภัยหรือการติดตามได้อย่างง่ายดาย เป็นต้น
มีชุดเครื่องมือ SOAP สำหรับภาษาการเขียนโปรแกรมต่างๆ (และแม้แต่ภาษาก่อนหน้า) เวอร์ชันของไมโครซอฟต์ C++ และ Visual Basic) มิฉะนั้นเพื่อให้การติดต่อสื่อสารกับบริการผ่านทางรับวิธีการ
และ HTTP POST คุณจะต้องสร้างสตริงการสืบค้นด้วยตนเองอย่างชัดเจน จากนั้นจึงแยกวิเคราะห์การตอบกลับ
มาตรฐานดิสโก้
มาตรฐาน DISCO มอบวิธีที่ง่ายที่สุดในการเข้าถึงไฟล์ Manifest ทำให้คุณสามารถจัดกลุ่มการอ้างอิงไปยังบริการเว็บได้ ไฟล์ DISCO สามารถรวมไฟล์จากเว็บเซิร์ฟเวอร์ต่างๆ และรองรับ "การค้นหาแบบไดนามิก" -ค้นหาอัตโนมัติ
ไฟล์ Manifest มีประโยชน์เนื่องจากรวมบริการเว็บหลายรายการไว้ในรายการเดียว แต่ไม่อนุญาตให้ไคลเอ็นต์ค้นหาบริการเว็บประเภทใดประเภทหนึ่งโดยไม่ระบุชื่อบริษัทที่พัฒนาไฟล์ดังกล่าว
ข้อมูลจำเพาะของอุดดี้
ข้อกำหนดคุณลักษณะ UDDI (Universal Description, Discovery และ Integration) หลีกเลี่ยงปัญหาเหล่านี้โดยใช้หน่วยเก็บข้อมูลพิเศษ (พื้นที่เก็บข้อมูล) ซึ่งองค์กรและองค์กรสามารถวางข้อมูลเกี่ยวกับบริการที่ตนจัดเตรียมไว้ บริษัทมากกว่า 100 แห่งได้บุกเบิกการสร้างสรรค์เทคโนโลยี UDDI (สามารถดูรายชื่อทั้งหมดได้ที่ http://www.uddi.org/community.html) รวมถึง Sun และ Microsoft บริษัทเหล่านี้ร่วมกันพัฒนาร่างข้อกำหนด UDDI ซึ่งได้รับการกำหนดมาตรฐานหลังจากผ่านไป 18 เดือน
ข้อมูลในที่เก็บนี้ต้องได้รับการอัปเดตด้วยตนเอง ด้วยเหตุนี้ "ผู้ดำเนินการโหนด" บางรายจะรักษาสำเนาของที่เก็บ UDDI ที่เหมือนกัน บริษัทเหล่านี้จัดให้มีการจัดเก็บพื้นที่เก็บข้อมูลที่ระบุและเข้าถึงได้ฟรีเพื่อทำให้บริการเว็บเป็นที่นิยม นอกจากนี้ Microsoft ได้รวมเวอร์ชันของ UDDI ไว้ในซอฟต์แวร์ด้วย เซิร์ฟเวอร์วินโดวส์.NET สำหรับใช้งานบนอินทราเน็ตขององค์กร
ร้านค้า UDDI ประกอบด้วยข้อมูลเกี่ยวกับองค์กรที่ให้บริการเว็บ ประเภทของแต่ละบริการ และความสัมพันธ์กับข้อมูลและข้อกำหนดที่เกี่ยวข้องกับบริการเหล่านั้น อินเทอร์เฟซ UDDI นั้นเป็นบริการบนเว็บ หากต้องการลงทะเบียนหรือค้นหาบริการ คุณต้องส่งข้อความ SOAP
ข้อเสียเปรียบหลักของบริการเว็บคือประสิทธิภาพที่ต่ำกว่าและขนาดที่ใหญ่ขึ้น การรับส่งข้อมูลเครือข่ายเมื่อเปรียบเทียบกับเทคโนโลยีเช่น RMI, CORBA, DCOM เนื่องจากการใช้ข้อความ XML
ชื่อกระทู้เป็นคำถามจริงๆ เพราะ... ฉันเองก็ไม่รู้ว่ามันคืออะไรและเป็นครั้งแรกที่ฉันจะพยายามทำงานกับมันภายในกรอบของบทความนี้ สิ่งเดียวที่ฉันรับประกันได้ก็คือโค้ดที่แสดงด้านล่างจะใช้งานได้ แต่วลีของฉันจะเป็นเพียงการคาดเดาและการเดาว่าฉันเข้าใจทั้งหมดนี้ได้อย่างไร ไปกันเลย...
การแนะนำ
เราต้องเริ่มต้นด้วยสาเหตุที่แนวคิดของบริการเว็บถูกสร้างขึ้น เมื่อแนวคิดนี้ปรากฏขึ้นในโลก เทคโนโลยีก็มีอยู่แล้วที่อนุญาตให้แอปพลิเคชันโต้ตอบในระยะไกล โดยที่โปรแกรมหนึ่งสามารถเรียกวิธีการบางอย่างในอีกโปรแกรมหนึ่ง ซึ่งสามารถเปิดใช้งานบนคอมพิวเตอร์ที่ตั้งอยู่ในเมืองอื่นหรือแม้แต่ประเทศอื่นได้ ทั้งหมดนี้เรียกสั้น ๆ ว่า RPC (การเรียกขั้นตอนระยะไกล) ตัวอย่างได้แก่ เทคโนโลยีคอร์บาและสำหรับ Java - RMI (การเรียกใช้เมธอดระยะไกล) และทุกอย่างดูเหมือนจะดีในตัวพวกเขา โดยเฉพาะใน CORBA เพราะ... คุณสามารถทำงานกับมันในภาษาการเขียนโปรแกรมใดก็ได้ แต่ยังมีบางอย่างขาดหายไป ฉันเชื่อว่าข้อเสียของ CORBA คือมันทำงานผ่านตัวมันเองบางส่วนได้ โปรโตคอลเครือข่ายแทน HTTP ง่าย ๆซึ่งจะพอดีกับไฟร์วอลล์ใด ๆ แนวคิดของบริการเว็บคือการสร้าง RPC ที่จะแทรกลงในแพ็กเก็ต HTTP จึงเริ่มมีการพัฒนามาตรฐาน แนวคิดพื้นฐานของมาตรฐานนี้คืออะไร:- สบู่- ก่อนที่จะเรียกขั้นตอนระยะไกล คุณต้องอธิบายการโทรนี้ก่อน ไฟล์ XMLรูปแบบ e SOAP สบู่เป็นเพียงหนึ่งในหลาย ๆ อย่าง มาร์กอัป XMLซึ่งใช้ในบริการทางเว็บ ทุกสิ่งที่เราต้องการที่จะส่งที่ไหนสักแห่งผ่านทาง HTTP จะถูกเปลี่ยนเป็นครั้งแรก คำอธิบาย XML SOAP จากนั้นยัดลงในแพ็กเก็ต HTTP และส่งไปยังคอมพิวเตอร์เครื่องอื่นบนเครือข่ายผ่าน TCP/IP
- WSDL- มีบริการเว็บเช่น โปรแกรมที่สามารถเรียกวิธีการจากระยะไกลได้ แต่มาตรฐานกำหนดให้โปรแกรมนี้ต้องมีคำอธิบายว่า "ใช่ คุณพูดถูก นี่คือบริการทางเว็บจริงๆ และคุณสามารถเรียกใช้วิธีการดังกล่าวได้จากบริการดังกล่าว" คำอธิบายนี้แสดงด้วยไฟล์ XML อื่นซึ่งมีรูปแบบที่แตกต่างกัน คือ WSDL เหล่านั้น. WSDL เป็นเพียงไฟล์ XML ที่อธิบายบริการบนเว็บและไม่มีอะไรเพิ่มเติม
แนวทางทั่วไป
ในบริการเว็บจะมีไคลเอนต์และเซิร์ฟเวอร์อยู่เสมอ เซิร์ฟเวอร์คือบริการบนเว็บของเรา และบางครั้งเรียกว่าจุดสิ้นสุด (เช่นเดียวกับใน จุดสิ้นสุดที่ข้อความ SOAP จากไคลเอนต์ไปถึง) เราจำเป็นต้องทำสิ่งต่อไปนี้:- อธิบายอินเทอร์เฟซของบริการบนเว็บของเรา
- ใช้อินเทอร์เฟซนี้
- เปิดตัวบริการบนเว็บของเรา
- เขียนลูกค้าและโทรจากระยะไกล วิธีที่ต้องการบริการเว็บ
เซิร์ฟเวอร์
มาเปิดตัว IDEA และสร้างโครงการใหม่กันเถอะ สร้างโครงการใหม่- มาระบุชื่อกันเถอะ สวัสดีเว็บเซอร์วิสและกดปุ่ม ต่อไปจากนั้นกดปุ่ม เสร็จ- ในโฟลเดอร์ srcมาสร้างแพ็คเกจกันดีกว่า ru.javarush.ws- ในแพ็คเกจนี้เราจะสร้างอินเทอร์เฟซ HelloWebService: package ru ชวารัช เป็น; // นี่คือคำอธิบายประกอบ เช่น วิธีทำเครื่องหมายชั้นเรียนและวิธีการของเรา // เกี่ยวข้องกับเทคโนโลยีบริการเว็บนำเข้า javax. เจดับบลิว. Webวิธีการ; นำเข้า javax. เจดับบลิว. บริการเว็บ;นำเข้า javax. เจดับบลิว. สบู่. การผูกสบู่; // เราบอกว่าอินเทอร์เฟซของเราจะทำงานเป็นบริการบนเว็บ@บริการเว็บ // เราบอกว่าเว็บเซอร์วิสจะใช้ในการเรียกเมธอด@SOAPBinding (style = SOAPBinding.Style.RPC) อินเทอร์เฟซสาธารณะ HelloWebService ( // เราบอกว่าวิธีนี้สามารถเรียกจากระยะไกลได้@WebMethod สตริงสาธารณะ getHelloString (ชื่อสตริง); ) ในโค้ดนี้ คลาส WebService และ WebMethod เรียกว่าคำอธิบายประกอบและไม่ทำอะไรเลยนอกจากทำเครื่องหมายอินเทอร์เฟซของเราและวิธีการของมันเป็นบริการเว็บ เช่นเดียวกับคลาส SOAPBinding ข้อแตกต่างเพียงอย่างเดียวคือ SOAPBinding เป็นคำอธิบายประกอบพร้อมพารามิเตอร์ ในในกรณีนี้ พารามิเตอร์ style ใช้กับค่าที่ระบุว่าบริการเว็บจะไม่ทำงานผ่านข้อความเอกสาร แต่เป็น RPC แบบคลาสสิกเช่น เพื่อเรียกวิธีการ ลองใช้ตรรกะอินเทอร์เฟซของเราและสร้างคลาส HelloWebServiceImpl ในแพ็คเกจของเรา โดยวิธีการที่ฉันทราบว่าการสิ้นสุดคลาสด้วย Impl เป็นแบบแผนใน Java ตามที่กำหนดการใช้งานอินเทอร์เฟซ (Impl - จากคำว่า การใช้งาน เช่น การใช้งาน) นี่ไม่ใช่ข้อกำหนดและคุณมีอิสระที่จะตั้งชื่อคลาสตามที่คุณต้องการ แต่ต้องมีมารยาทที่ดี: package ru ชวารัช เป็น; // คำอธิบายประกอบแบบเดียวกับเมื่ออธิบายอินเทอร์เฟซ นำเข้า javax. เจดับบลิว. บริการเว็บ;// แต่ที่นี่ใช้กับพารามิเตอร์ endpointInterface// บ่งชี้ ชื่อเต็มคลาสอินเทอร์เฟซของบริการบนเว็บของเรา @บริการเว็บ (endpointInterface="ru.javarush.ws.HelloWebService" ) คลาสสาธารณะ HelloWebServiceImpl ใช้ HelloWebService ( @Override public String getHelloString (ชื่อสตริง) (//ก็แค่กลับมาทักทาย srcกลับ "สวัสดี" + ชื่อ + "!" - ) ) มาเปิดตัวบริการเว็บของเรากัน เซิร์ฟเวอร์แบบสแตนด์อโลน, เช่น. โดยไม่ต้องมีส่วนร่วมของ Tomcat และเซิร์ฟเวอร์แอปพลิเคชันใด ๆ (นี่คือหัวข้อสำหรับการสนทนาแยกต่างหาก) เมื่อต้องการทำเช่นนี้ในโครงสร้างโครงการในโฟลเดอร์ มาสร้างแพ็คเกจ ru.javarush.endpoint กัน และในนั้นเราจะสร้างคลาส HelloWebServicePublisher ด้วยวิธีการหลัก: package ru ชวารัช จุดสิ้นสุด;// คลาสสำหรับการรันเว็บเซิร์ฟเวอร์พร้อมบริการเว็บ นำเข้า javax. xml. ส. จุดสิ้นสุด; // คลาสของบริการเว็บของเรา นำเข้า ru. ชวารัช ส. สวัสดีWebServiceImpl; HelloWebServicePublisher ระดับสาธารณะ ( public static void main (String... args) ( "http://localhost:1986/wss/hello", HelloWebServiceImpl ใหม่ () ; ) ) ทีนี้เรามาเริ่มคลาสนี้กันดีกว่าโดยคลิกกะ+F10- จะไม่ปรากฏในคอนโซล แต่เซิร์ฟเวอร์กำลังทำงานอยู่ คุณสามารถตรวจสอบได้โดยพิมพ์บรรทัด http://localhost:1986/wss/hello?wsdl ในเบราว์เซอร์ของคุณ ในทางกลับกัน หน้าที่เปิดขึ้นมาจะพิสูจน์ได้ว่าเรามีเว็บเซิร์ฟเวอร์ (http://) ที่ทำงานบนพอร์ต 1986 บนคอมพิวเตอร์ของเรา (localhost) และในทางกลับกัน แสดงคำอธิบาย WSDL ของบริการบนเว็บของเรา หากคุณหยุดแอปพลิเคชัน คำอธิบายจะไม่สามารถใช้งานได้ เช่นเดียวกับบริการบนเว็บ ดังนั้นเราจะไม่ทำเช่นนี้ แต่ดำเนินการเขียนไคลเอ็นต์ต่อไป
ลูกค้า srcในโฟลเดอร์โครงการ มาสร้างแพ็คเกจ ru.javarush.client และในคลาส HelloWebServiceClient ด้วยวิธีการหลัก: package ru ชวารัช ลูกค้า; // จำเป็นต้องรับคำอธิบาย wsdl และผ่านมัน// เข้าถึงบริการเว็บเอง นำเข้าจาวา สุทธิ. URL;// ข้อยกเว้นนี้จะเกิดขึ้นเมื่อทำงานกับวัตถุ URL นำเข้าจาวา สุทธิ. URLException มีรูปแบบไม่ถูกต้อง; // คลาสเพื่อแยกวิเคราะห์ xml พร้อมคำอธิบาย wsdl// และไปถึงแท็กบริการในนั้น นำเข้า javax. xml. เนมสเปซ ชื่อคิว;นำเข้า javax. xml. ส. บริการ; // อินเทอร์เฟซของบริการเว็บของเรา (เราต้องการมากกว่านี้) นำเข้า ru. ชวารัช ส. สวัสดีเว็บเซอร์วิส; HelloWebServiceClient คลาสสาธารณะ ( โมฆะสาธารณะคงหลัก (String args) พ่น MalformedURLException ( // สร้างลิงก์ไปยังคำอธิบาย wsdl) ; URL URL = URL ใหม่ ( "http://localhost:1986/wss/hello?wsdl"// เราดูที่พารามิเตอร์ของตัวสร้างถัดไปในแท็กแรกของคำอธิบาย WSDL - คำจำกัดความ // ดูอาร์กิวเมนต์ที่ 1 ในแอตทริบิวต์ targetNamespace // ดูอาร์กิวเมนต์ที่ 2 ในแอตทริบิวต์ชื่อ, QName qname = QName ใหม่ ("http://ws.site/" , "HelloWebServiceImplService" ) ;// ตอนนี้เราสามารถเข้าถึงแท็กบริการได้แล้ว คำอธิบาย wsdl การบริการ= บริการ สร้าง (url, qname) ; //แล้วขึ้นไปถึงพอร์ตแท็กที่ซ้อนกันอยู่นั่นเอง // รับลิงก์ไปยังวัตถุบริการเว็บระยะไกลจากเรา HelloWebService สวัสดี = บริการ getPort(HelloWebService.class);// ฮูเร่! ตอนนี้คุณสามารถโทร
วิธีการระยะไกล ระบบ. ออก. println (สวัสดี getHelloString ( "JavaRush" ) ) ;ไปยังบริการทางเว็บ ฉันจะพูดอีกครั้งว่าสิ่งที่ฉันเขียนส่วนใหญ่เป็นการเดาของฉันว่ามันทำงานอย่างไร ดังนั้นคุณไม่ควรเชื่อใจฉันมากเกินไป ฉันจะขอบคุณถ้า คนที่มีความรู้พวกเขาจะแก้ไขฉันเพราะแล้วฉันจะเรียนรู้บางสิ่งบางอย่าง รปภ.ในบทที่ 2 เราได้พูดคุยกันว่าหลังจากสร้างบริการเว็บบนเซิร์ฟเวอร์เป็นเซิร์ฟเล็ต, เพจ JSP, ไฟล์ JWS, EJB หรืออ็อบเจ็กต์อื่นๆ คุณควรอธิบายองค์ประกอบและความสามารถของบริการเว็บในภาษาที่ไม่ขึ้นกับแพลตฟอร์ม ระบบปฏิบัติการระบบโปรแกรมที่ใช้ในการสร้างบริการเว็บ คำอธิบายนี้ได้รับการลงทะเบียนในตำแหน่งที่สาธารณชนสามารถเข้าถึงได้บนอินเทอร์เน็ต เช่น รีจิสทรี UDDI หรือ ebXML หรือจัดเก็บไว้ในเซิร์ฟเวอร์บริการเว็บ คำอธิบายจะต้องมีข้อมูลครบถ้วน และ ข้อมูลที่ถูกต้องเกี่ยวกับบริการทั้งหมดที่มีให้โดยบริการบนเว็บ วิธีการรับบริการ เนื้อหาของคำขอบริการ รูปแบบของข้อมูลที่ให้ไว้
วิธีการหนึ่งในการอธิบายบริการบนเว็บอย่างถูกต้องและสม่ำเสมอคือภาษา WSDL ที่สร้างขึ้นโดยกลุ่ม W3C ภาษานี้เป็นการนำ XML ไปใช้อีกอย่างหนึ่ง ข้อมูลจำเพาะที่แนะนำล่าสุดจะถูกเผยแพร่บนเพจเสมอ http://www.w3.org/TR/wsdI- ในขณะที่เขียนหนังสือ เวอร์ชัน WSDL คือ 1.2 ซึ่งเราจะอธิบายในบทนี้
องค์ประกอบของเอกสาร WSDL
องค์ประกอบรูทของเอกสาร XML - คำอธิบาย WSDL - คือองค์ประกอบ
คำจำกัดความของ WSDL ใช้ประโยชน์จากเนมสเปซต่างๆ อย่างกว้างขวาง นอกจากชื่อที่ถูกต้องแล้ว WSDL ยังใช้ชื่อองค์ประกอบประเภทและภาษาการประกาศอีกด้วย สคีมา XSD(ดูบทที่ 1) และชื่อภาษา โปรโตคอลสบู่- เนมสเปซ WSDL มักถูกอธิบายว่าเป็นเนมสเปซเริ่มต้น ตัวระบุเนมสเปซของ WSDL 1.2 เวอร์ชันล่าสุดในขณะที่เขียนมีค่าเท่ากับ http://www.w3.org/2002/07/wsdl- เนมสเปซเป้าหมายที่มีการระบุตัวระบุโดยแอตทริบิวต์มักจะนำหน้าด้วย tns (เนมสเปซเป้าหมาย)
ไปยังองค์ประกอบราก
?
?
?
?
?
? < service >- ระบุตำแหน่งของบริการบนเว็บเป็นหนึ่งพอร์ตหรือมากกว่า แต่ละพอร์ตอธิบายโดยองค์ประกอบที่ซ้อนกัน
นอกจากองค์ประกอบหลักทั้ง 6 ประการนี้แล้ว ยังมีองค์ประกอบเสริมอีก 2 องค์ประกอบอีกด้วย
?
ความคิดเห็น สามารถรวมไว้ในองค์ประกอบใดก็ได้
คำอธิบาย WSDL
เราสามารถพูดได้ว่าธาตุต่างๆ
องค์ประกอบ
ในที่สุดองค์ประกอบ
โครงสร้างของเอกสาร WSDL แสดงอยู่ในรายการ 4.1 อักขระในวงเล็บเหลี่ยมไม่มีอยู่ในเอกสาร พวกเขาแสดงการซ้ำซ้อนขององค์ประกอบหรือคุณลักษณะในคำอธิบายบริการเว็บ:
อักขระ [?] หมายความว่าองค์ประกอบหรือแอตทริบิวต์อาจปรากฏเป็นศูนย์หรือหนึ่งครั้งในเอกสาร
สัญลักษณ์ [*] หมายความว่าองค์ประกอบอาจปรากฏเป็นศูนย์หรือมากกว่านั้น
สัญลักษณ์ [+] หมายความว่าองค์ประกอบอาจปรากฏขึ้นหนึ่งครั้งหรือมากกว่านั้น
การไม่มีอักขระในวงเล็บเหลี่ยมหมายความว่าแอตทริบิวต์จะต้องปรากฏเพียงครั้งเดียว
เจ รายการ 4.1. สคีมาเอกสาร WSDL
targetNamespace = "nfleH l ra « iij ตำแหน่ง = "URI-aflpec" /> [*] แสดงความคิดเห็นฟรี คำอธิบายของประเภทที่ซับซ้อนและไม่ได้มาตรฐาน
คำอธิบายเชิงนามธรรมของข้อความ SOAP ที่เป็นชุดของส่วนที่เป็นส่วนประกอบ
คำอธิบายเชิงนามธรรมของบริการเว็บเป็นชุดของการดำเนินการ (บริการ) คำอธิบายของบริการเป็นข้อความรับ (อินพุต) และการส่ง (เอาต์พุต ข้อบกพร่อง) ได้รับข้อความ. ส่งแล้ว message="nMH องค์ประกอบที่สอดคล้องกัน ข้อความแสดงข้อผิดพลาดที่จะส่ง type="MMH ขององค์ประกอบที่เกี่ยวข้อง รายละเอียดโปรโตคอลเฉพาะ พวกมันถูกกำหนดไว้ในสคีมา โปรโตคอลนี้ - องค์ประกอบที่อธิบายรายละเอียดเขียนไว้ที่นี่ การดำเนินการเฉพาะ - องค์ประกอบที่อธิบาย รายละเอียดของข้อความเฉพาะที่ได้รับ - องค์ประกอบที่อธิบาย รายละเอียดของข้อความเฉพาะที่กำลังส่ง -
องค์ประกอบที่อธิบาย รายละเอียดของข้อความแสดงข้อผิดพลาดเฉพาะ -
serviceType="MMH ขององค์ประกอบที่เกี่ยวข้อง คำอธิบายของอินเทอร์เฟซบริการเว็บเป็นชุดของพอร์ต Binding="nMH ขององค์ประกอบที่เกี่ยวข้อง ที่นี่เขียนที่อยู่บังคับและที่อยู่เดียวของอินเทอร์เฟซบริการเว็บซึ่งเขียนตามกฎ โปรโตคอลที่ระบุในองค์ประกอบ
โปรโตคอลการถ่ายโอนข้อความเฉพาะแต่ละรายการ - SOAP, HTTP, FTP, SMTP - เพิ่มองค์ประกอบเพิ่มเติมของตัวเองให้กับองค์ประกอบหลักหกองค์ประกอบและสององค์ประกอบเสริมของภาษา WSDL โดยอธิบายคุณสมบัติของโปรโตคอลนี้
ลองยกตัวอย่างง่ายๆ ในรายการ 3.14 เราได้เขียนเว็บเซอร์วิสแบบธรรมดาเป็นคลาส Java ที่ส่งคืนคำขอที่ส่งโดยไม่มีการประมวลผลใดๆ:
EchoService ระดับสาธารณะ (
สตริงสาธารณะ getEcho (คำขอสตริง) ( คำขอส่งคืน;
รายการ 4.2 อธิบายบริการเว็บนี้ใน WSDL โดยใช้โปรโตคอล SOAP
รายการ 4.2. คำอธิบายของบริการเว็บ EchoService
รุ่น = "1.0" การเข้ารหัส = "UTF-8" ?>
targetNamespace="http://echoservice.com/echoservice.wsdl" xmlns="http://www.w3.org/2002/07/wsdl" xmlns:tns="http://echoservice.com/echoservice.wsdl " xmlns:soap="http://www.w3.org/2002/07/wsdl/soapl2" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
ขนส่ง = "http://schemas.xmlsoap.org/soap/http" /> "http://schemas.xmlsoap.org/soap/encoding/" เนมสเปซ = "http://echoservice.ccm/echcservice.wsdl" ใช้ = "เข้ารหัส" /> ^oapKbocy enccdingStyle= "http: //schemas .xmlsoap.org/soap/encoding/" namespace= "http: //echoservice. c^/ech^service .wsdl" use="encoded" /> "http://localhost:8080/axis/EchoService.jws" /> ในรายการ 4.2 เราอยู่ในองค์ประกอบ ชื่อ "getEchoRequest" และ "getEchoResponse" ถูกใช้ในองค์ประกอบถัดไป txarspcrt^=^"ht:tp^://?chepas^.>plscap^.c^rc^/?cap^/ht:tp^" /> หากใช้สไตล์เอกสาร SOAP แอตทริบิวต์ style จะถูกตั้งค่าเป็น "document" ในที่สุดในองค์ประกอบ ในรายการ 4.2 ชื่อที่ขึ้นต้นด้วยสบู่จะระบุคำอธิบายของข้อความและวิธีการส่งข้อความ มาดูกันว่าข้อกำหนดเฉพาะของ WSDL 1.2 มีโปรโตคอลเฉพาะใดบ้าง วรรณกรรม: Khabibullin I. Sh. การพัฒนาบริการเว็บโดยใช้ Java - เซนต์ปีเตอร์สเบิร์ก: BHV-Petersburg, 2546 - 400 หน้า: ป่วย ชื่อกระทู้เป็นคำถามจริงๆ เพราะ... ฉันเองก็ไม่รู้ว่ามันคืออะไรและเป็นครั้งแรกที่ฉันจะพยายามทำงานกับมันภายในกรอบของบทความนี้ สิ่งเดียวที่ฉันรับประกันได้ก็คือโค้ดที่แสดงด้านล่างจะใช้งานได้ แต่วลีของฉันจะเป็นเพียงการคาดเดาและการเดาว่าฉันเข้าใจทั้งหมดนี้ได้อย่างไร ไปกันเลย...การแนะนำ
เราต้องเริ่มต้นด้วยสาเหตุที่แนวคิดของบริการเว็บถูกสร้างขึ้น เมื่อแนวคิดนี้ปรากฏขึ้นในโลก เทคโนโลยีก็มีอยู่แล้วที่อนุญาตให้แอปพลิเคชันโต้ตอบในระยะไกล โดยที่โปรแกรมหนึ่งสามารถเรียกวิธีการบางอย่างในอีกโปรแกรมหนึ่ง ซึ่งสามารถเปิดใช้งานบนคอมพิวเตอร์ที่ตั้งอยู่ในเมืองอื่นหรือแม้แต่ประเทศอื่นได้ ทั้งหมดนี้เรียกสั้น ๆ ว่า RPC (การเรียกขั้นตอนระยะไกล) ตัวอย่าง ได้แก่ เทคโนโลยี CORBA และสำหรับ Java - RMI (Remote Method Invoking) และทุกอย่างดูเหมือนจะดีในตัวพวกเขา โดยเฉพาะใน CORBA เพราะ... คุณสามารถทำงานกับมันในภาษาการเขียนโปรแกรมใดก็ได้ แต่ยังมีบางอย่างขาดหายไป ฉันเชื่อว่าข้อเสียของ CORBA ก็คือว่ามันทำงานผ่านโปรโตคอลเครือข่ายบางตัวของตัวเอง แทนที่จะเป็น HTTP แบบธรรมดา ซึ่งจะพอดีกับไฟร์วอลล์ใดๆ แนวคิดของบริการเว็บคือการสร้าง RPC ที่จะแทรกลงในแพ็กเก็ต HTTP จึงเริ่มมีการพัฒนามาตรฐาน แนวคิดพื้นฐานของมาตรฐานนี้คืออะไร:
ทำไมคุณถามสั้น ๆ ? คุณไม่สามารถเจาะจงมากขึ้นได้ไหม? อาจเป็นไปได้ แต่การทำเช่นนี้ คุณจะต้องหันไปหาหนังสือเช่น T. Mashnin, “Java Web Services” ใน 200 หน้าแรก มีคำอธิบายโดยละเอียดของแต่ละแท็กของมาตรฐาน SOAP และ WSDL มันคุ้มค่าที่จะทำไหม? ในความคิดของฉัน ไม่ เพราะ... ทั้งหมดนี้ถูกสร้างขึ้นโดยอัตโนมัติใน Java และคุณเพียงแค่ต้องเขียนเนื้อหาของวิธีการที่ควรจะเรียกจากระยะไกลเท่านั้น ดังนั้น API เช่น JAX-RPC จึงปรากฏใน Java หากใครไม่ทราบ เมื่อพวกเขาบอกว่า Java มี API เช่นนั้น นั่นหมายความว่ามีแพ็คเกจที่มีชุดคลาสที่ห่อหุ้มเทคโนโลยีดังกล่าวไว้ JAX-RPC พัฒนาไปตามกาลเวลาจากเวอร์ชันสู่เวอร์ชันและในที่สุดก็กลายเป็น JAX-WS เห็นได้ชัดว่า WS ย่อมาจาก WebService และใครๆ ก็คิดว่านี่เป็นเพียงการเปลี่ยนชื่อ RPC เป็นคำศัพท์ยอดนิยมในปัจจุบัน ซึ่งไม่เป็นความจริงเพราะว่า ขณะนี้บริการทางเว็บได้ย้ายออกไปจากแนวคิดดั้งเดิม และช่วยให้คุณไม่เพียงแต่เรียกวิธีการระยะไกลเท่านั้น แต่ยังส่งข้อความเอกสารในรูปแบบ SOAP ได้อีกด้วย ฉันยังไม่รู้ว่าทำไมสิ่งนี้ถึงจำเป็น ไม่น่าเป็นไปได้ที่คำตอบในที่นี้จะเป็น "ในกรณีที่จำเป็น" ตัวฉันเองต้องการเรียนรู้จากสหายที่มีประสบการณ์มากกว่า และสุดท้าย JAX-RS ก็ปรากฏขึ้นสำหรับสิ่งที่เรียกว่าบริการเว็บ RESTful แต่นี่คือหัวข้อของบทความแยกต่างหาก การแนะนำตัวจะจบลงเพียงเท่านี้ เพราะ... ต่อไปเราจะเรียนรู้การทำงานกับ JAX-WS แนวทางทั่วไป
ในบริการเว็บจะมีไคลเอนต์และเซิร์ฟเวอร์อยู่เสมอ เซิร์ฟเวอร์คือบริการบนเว็บของเรา และบางครั้งเรียกว่าจุดสิ้นสุด (เช่นเดียวกับใน จุดสิ้นสุดที่ข้อความ SOAP จากไคลเอนต์ไปถึง) เราจำเป็นต้องทำสิ่งต่อไปนี้:
คุณสามารถเปิดบริการเว็บได้หลายวิธี: อธิบายคลาสด้วยวิธีการหลักและเปิดบริการเว็บโดยตรงในฐานะเซิร์ฟเวอร์ หรือปรับใช้กับเซิร์ฟเวอร์เช่น Tomcat หรืออื่น ๆ ในกรณีที่สอง เราไม่ได้เปิดเซิร์ฟเวอร์ใหม่และไม่ได้เปิดพอร์ตอื่นบนคอมพิวเตอร์ แต่เพียงบอกคอนเทนเนอร์เซิร์ฟเล็ต Tomcat ว่า “เราได้เขียนคลาสบริการเว็บที่นี่ โปรดเผยแพร่เพื่อให้ทุกคนที่ติดต่อคุณสามารถ ใช้บริการเว็บของเรา" ไม่ว่าเราจะเปิดบริการเว็บด้วยวิธีใดเราก็จะมีลูกค้ารายเดียวกัน เซิร์ฟเวอร์
มาเปิดตัว IDEA และสร้างโครงการใหม่กันเถอะ สร้างโครงการใหม่- มาระบุชื่อกันเถอะ สวัสดีเว็บเซอร์วิสและกดปุ่ม ต่อไปจากนั้นกดปุ่ม เสร็จ- ในโฟลเดอร์ srcมาสร้างแพ็คเกจกันดีกว่า ru.javarush.ws- ในแพ็คเกจนี้เราจะสร้างอินเทอร์เฟซ HelloWebService: package ru ชวารัช เป็น; // นี่คือคำอธิบายประกอบ เช่น วิธีทำเครื่องหมายชั้นเรียนและวิธีการของเรา
// เกี่ยวข้องกับเทคโนโลยีบริการเว็บนำเข้า javax. เจดับบลิว. Webวิธีการ; นำเข้า javax. เจดับบลิว. บริการเว็บ;นำเข้า javax. เจดับบลิว. สบู่. การผูกสบู่; // เราบอกว่าอินเทอร์เฟซของเราจะทำงานเป็นบริการบนเว็บ@บริการเว็บ // เราบอกว่าเว็บเซอร์วิสจะใช้ในการเรียกเมธอด@WebMethod สตริงสาธารณะ getHelloString (ชื่อสตริง); ) ในโค้ดนี้ คลาส WebService และ WebMethod เรียกว่าคำอธิบายประกอบและไม่ทำอะไรเลยนอกจากทำเครื่องหมายอินเทอร์เฟซของเราและวิธีการของมันเป็นบริการเว็บ เช่นเดียวกับคลาส SOAPBinding ข้อแตกต่างเพียงอย่างเดียวคือ SOAPBinding เป็นคำอธิบายประกอบพร้อมพารามิเตอร์ ในในกรณีนี้ พารามิเตอร์ style ใช้กับค่าที่ระบุว่าบริการเว็บจะไม่ทำงานผ่านข้อความเอกสาร แต่เป็น RPC แบบคลาสสิกเช่น เพื่อเรียกวิธีการ ลองใช้ตรรกะอินเทอร์เฟซของเราและสร้างคลาส HelloWebServiceImpl ในแพ็คเกจของเรา โดยวิธีการที่ฉันทราบว่าการสิ้นสุดคลาสด้วย Impl เป็นแบบแผนใน Java ตามที่กำหนดการใช้งานอินเทอร์เฟซ (Impl - จากคำว่า การใช้งาน เช่น การใช้งาน) นี่ไม่ใช่ข้อกำหนดและคุณมีอิสระที่จะตั้งชื่อคลาสตามที่คุณต้องการ แต่ต้องมีมารยาทที่ดี: package ru ชวารัช เป็น;
) ในโค้ดนี้ คลาส WebService และ WebMethod เรียกว่าคำอธิบายประกอบและไม่ทำอะไรเลยนอกจากทำเครื่องหมายอินเทอร์เฟซของเราและวิธีการของมันเป็นบริการเว็บ เช่นเดียวกับคลาส SOAPBinding ข้อแตกต่างเพียงอย่างเดียวคือ SOAPBinding เป็นคำอธิบายประกอบพร้อมพารามิเตอร์ ในกรณีนี้ พารามิเตอร์ style จะถูกใช้พร้อมกับค่าที่ระบุว่าบริการเว็บจะไม่ทำงานผ่านข้อความเอกสาร แต่เป็น RPC แบบคลาสสิกเช่น เพื่อเรียกวิธีการ ลองใช้ตรรกะอินเทอร์เฟซของเราและสร้างคลาส HelloWebServiceImpl ในแพ็คเกจของเรา โดยวิธีการที่ฉันทราบว่าการสิ้นสุดคลาสด้วย Impl เป็นแบบแผนใน Java ตามที่กำหนดการใช้งานอินเทอร์เฟซ (Impl - จากคำว่า การใช้งาน เช่น การใช้งาน) นี่ไม่ใช่ข้อกำหนดและคุณมีอิสระที่จะตั้งชื่อคลาสตามที่คุณต้องการ แต่ต้องมีมารยาทที่ดี: package ru ชวารัช เป็น;// บ่งชี้ ชื่อเต็มคลาสอินเทอร์เฟซของบริการบนเว็บของเรา @บริการเว็บ (endpointInterface=// ระบุชื่อเต็มของคลาสอินเทอร์เฟซของบริการเว็บของเรา srcกลับ "สวัสดี" + ชื่อ + "!" - ) ) มาเปิดตัวบริการเว็บของเรากัน เซิร์ฟเวอร์แบบสแตนด์อโลน, เช่น. โดยไม่ต้องมีส่วนร่วมของ Tomcat และเซิร์ฟเวอร์แอปพลิเคชันใด ๆ (นี่คือหัวข้อสำหรับการสนทนาแยกต่างหาก) เมื่อต้องการทำเช่นนี้ในโครงสร้างโครงการในโฟลเดอร์ มาสร้างแพ็คเกจ ru.javarush.endpoint กัน และในนั้นเราจะสร้างคลาส HelloWebServicePublisher ด้วยวิธีการหลัก: package ru ชวารัช จุดสิ้นสุด;// คลาสสำหรับการรันเว็บเซิร์ฟเวอร์พร้อมบริการเว็บ นำเข้า javax. xml. ส. จุดสิ้นสุด;
// คลาสของบริการเว็บของเรา
นำเข้า ru. ชวารัช ส. สวัสดีWebServiceImpl; HelloWebServicePublisher ระดับสาธารณะ ( public static void main (String... args) ( "http://localhost:1986/wss/hello", HelloWebServiceImpl ใหม่ () ; ) ) ทีนี้เรามาเริ่มคลาสนี้กันดีกว่าโดยคลิกกะ+F10 - จะไม่ปรากฏในคอนโซล แต่เซิร์ฟเวอร์กำลังทำงานอยู่ คุณสามารถตรวจสอบได้โดยพิมพ์บรรทัด http://localhost:1986/wss/hello?wsdl ในเบราว์เซอร์ของคุณ ในทางกลับกัน หน้าที่เปิดขึ้นมาจะพิสูจน์ได้ว่าเรามีเว็บเซิร์ฟเวอร์ (http://) ที่ทำงานบนพอร์ต 1986 บนคอมพิวเตอร์ของเรา (localhost) และในทางกลับกัน แสดงคำอธิบาย WSDL ของบริการบนเว็บของเรา หากคุณหยุดแอปพลิเคชัน คำอธิบายจะไม่สามารถใช้งานได้ เช่นเดียวกับบริการบนเว็บ ดังนั้นเราจะไม่ทำเช่นนี้ แต่ดำเนินการเขียนไคลเอ็นต์ต่อไป
ลูกค้า srcในโฟลเดอร์โครงการ มาสร้างแพ็คเกจ ru.javarush.client และในคลาส HelloWebServiceClient ด้วยวิธีการหลัก: package ru ชวารัช ลูกค้า;
// จำเป็นต้องรับคำอธิบาย wsdl และผ่านมัน// เข้าถึงบริการเว็บเอง นำเข้าจาวา สุทธิ. URL;// ข้อยกเว้นนี้จะเกิดขึ้นเมื่อทำงานกับวัตถุ URL นำเข้าจาวา สุทธิ. URLException มีรูปแบบไม่ถูกต้อง;
// คลาสเพื่อแยกวิเคราะห์ xml พร้อมคำอธิบาย wsdl// และไปถึงแท็กบริการในนั้น นำเข้า javax. xml. เนมสเปซ ชื่อคิว;นำเข้า javax. xml. ส. บริการ; // อินเทอร์เฟซของบริการเว็บของเรา (เราต้องการมากกว่านี้)กลับ "สวัสดี" + ชื่อ + "!" - ) ) มาเปิดตัวบริการเว็บของเราในฐานะเซิร์ฟเวอร์อิสระเช่น โดยไม่ต้องมีส่วนร่วมของ Tomcat และเซิร์ฟเวอร์แอปพลิเคชันใด ๆ (นี่คือหัวข้อสำหรับการสนทนาแยกต่างหาก) เมื่อต้องการทำเช่นนี้ในโครงสร้างโครงการในโฟลเดอร์ // สร้างลิงก์ไปยังคำอธิบาย wsdl)
;
URL URL
= URL ใหม่ (
"http://localhost:1986/wss/hello?wsdl" URL URL = URL ใหม่ ( QName qname = QName ใหม่ ("http://ws.javarush.ru/" , "HelloWebServiceImplService" ) ;// ตอนนี้เราสามารถเข้าถึงแท็กบริการในคำอธิบาย wsdl แล้ว คำอธิบาย wsdl
การบริการ= บริการ สร้าง (url, qname) ; บริการ บริการ = บริการ สร้าง (url, qname) ; HelloWebService สวัสดี = บริการ getPort(HelloWebService.class); // ฮูเร่! ตอนนี้คุณสามารถโทร
// ฮูเร่! ตอนนี้คุณสามารถเรียกวิธีระยะไกลได้แล้ว รปภ.