ภาษา wsdl พร้อม WSDL สำหรับบริการเว็บรายการหนังสือ นี่คือลักษณะของคำขอบริการเว็บ

ในบทความนี้ ฉันจะพูดถึงไฟล์ 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 เหนือรูปแบบอื่นๆ สำหรับการถ่ายโอนข้อมูล:

และ 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 จึงเริ่มมีการพัฒนามาตรฐาน แนวคิดพื้นฐานของมาตรฐานนี้คืออะไร:
  1. สบู่- ก่อนที่จะเรียกขั้นตอนระยะไกล คุณต้องอธิบายการโทรนี้ก่อน ไฟล์ XMLรูปแบบ e SOAP สบู่เป็นเพียงหนึ่งในหลาย ๆ อย่าง มาร์กอัป XMLซึ่งใช้ในบริการทางเว็บ ทุกสิ่งที่เราต้องการที่จะส่งที่ไหนสักแห่งผ่านทาง HTTP จะถูกเปลี่ยนเป็นครั้งแรก คำอธิบาย XML SOAP จากนั้นยัดลงในแพ็กเก็ต HTTP และส่งไปยังคอมพิวเตอร์เครื่องอื่นบนเครือข่ายผ่าน TCP/IP
  2. WSDL- มีบริการเว็บเช่น โปรแกรมที่สามารถเรียกวิธีการจากระยะไกลได้ แต่มาตรฐานกำหนดให้โปรแกรมนี้ต้องมีคำอธิบายว่า "ใช่ คุณพูดถูก นี่คือบริการทางเว็บจริงๆ และคุณสามารถเรียกใช้วิธีการดังกล่าวได้จากบริการดังกล่าว" คำอธิบายนี้แสดงด้วยไฟล์ XML อื่นซึ่งมีรูปแบบที่แตกต่างกัน คือ WSDL เหล่านั้น. WSDL เป็นเพียงไฟล์ XML ที่อธิบายบริการบนเว็บและไม่มีอะไรเพิ่มเติม
ทำไมคุณถามสั้น ๆ ? คุณไม่สามารถเจาะจงมากขึ้นได้ไหม? อาจเป็นไปได้ แต่การทำเช่นนี้ คุณจะต้องหันไปหาหนังสือเช่น 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 จากไคลเอนต์ไปถึง) เราจำเป็นต้องทำสิ่งต่อไปนี้:
  1. อธิบายอินเทอร์เฟซของบริการบนเว็บของเรา
  2. ใช้อินเทอร์เฟซนี้
  3. เปิดตัวบริการบนเว็บของเรา
  4. เขียนลูกค้าและโทรจากระยะไกล วิธีที่ต้องการบริการเว็บ
สามารถเปิดใช้บริการเว็บได้ ในรูปแบบที่แตกต่างกัน: อธิบายคลาสด้วยวิธีการหลักและเรียกใช้บริการเว็บโดยตรงในฐานะเซิร์ฟเวอร์ หรือปรับใช้กับเซิร์ฟเวอร์เช่น Tomcat หรืออื่น ๆ ในกรณีที่สอง เราไม่เปิดตัวตัวเอง เซิร์ฟเวอร์ใหม่และเราจะไม่เปิดพอร์ตอื่นบนคอมพิวเตอร์ แต่เพียงบอกคอนเทนเนอร์เซิร์ฟเล็ต Tomcat ว่า "เราได้เขียนคลาสบริการเว็บที่นี่ โปรดเผยแพร่เพื่อให้ทุกคนที่ติดต่อคุณสามารถใช้บริการเว็บของเราได้" ไม่ว่าเราจะเปิดบริการเว็บด้วยวิธีใดเราก็จะมีลูกค้ารายเดียวกัน

เซิร์ฟเวอร์

มาเปิดตัว 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 (เนมสเปซเป้าหมาย)

ไปยังองค์ประกอบราก องค์ประกอบของหกพื้นฐานและสอง ประเภทเพิ่มเติม- องค์ประกอบทั้งหมดเป็นทางเลือก โดยสามารถมีจำนวนเท่าใดก็ได้ ยกเว้นองค์ประกอบ ซึ่งสามารถปรากฏได้เพียงครั้งเดียวในเอกสาร แต่ละองค์ประกอบมีชื่อ ซึ่งกำหนดโดยแอตทริบิวต์ชื่อที่ต้องการ องค์ประกอบต่างๆ อ้างอิงถึงกันโดยใช้ชื่อเหล่านี้ นี่คือองค์ประกอบที่ซ้อนอยู่ในองค์ประกอบรูท

? กำหนดประเภทที่ซับซ้อนซึ่งใช้โดยบริการเว็บโดยใช้ XSD หรือภาษาคำจำกัดความประเภทอื่น ไม่จำเป็นต้องใช้องค์ประกอบนี้หากบริการบนเว็บใช้เท่านั้น ประเภทง่ายๆอธิบายเป็นภาษา XSD

? - อธิบายแต่ละข้อความ SOAP: คำร้องขอ การตอบกลับ การโอนเอกสาร องค์ประกอบนี้มีองค์ประกอบ อธิบายส่วนของข้อความที่แบ่งแยกไม่ได้จากมุมมองของ WSDL สำหรับข้อความประเภทขั้นตอน แต่ละองค์ประกอบ อาจอธิบายชื่อและประเภทของอาร์กิวเมนต์คำขอเดียวหรือประเภทของค่าที่ส่งคืน สำหรับข้อความ ประเภทเอกสารองค์ประกอบ สามารถอธิบายแต่ละส่วนของข้อความ "หลายส่วน/เกี่ยวข้อง" ได้ คำอธิบายเชิงนามธรรมนี้ถูกทำให้เป็นเนื้อเดียวกันโดยองค์ประกอบต่างๆ .

? อธิบายอินเทอร์เฟซของบริการบนเว็บ เรียกว่าจุดสิ้นสุดหรือพอร์ตการมาถึงของข้อความใน WSDL โดยจะอธิบายว่าเป็นชุดของบริการเว็บที่เรียกว่า การดำเนินการ WSDL- การแปลคำอธิบายนี้เป็นภาษาการเขียนโปรแกรม คุณจะเห็นว่าพอร์ตแมปกับอินเทอร์เฟซ Java ได้ดี และการดำเนินการแต่ละอย่างแมปกับเมธอดในอินเทอร์เฟซนี้ได้ดี การดำเนินการอธิบายโดยองค์ประกอบที่ซ้อนกัน อธิบายแต่ละอย่าง บริการแยกต่างหาก- บริการนี้อธิบายโดยการดำเนินการซึ่งแบ่งออกเป็นสี่ประเภท นั่นคือสอง ขั้นตอนง่ายๆ: "การรับข้อความ", "การส่งข้อความตอบกลับ" และการกระทำสองอย่างรวมกัน: "การส่งข้อความ - รับการตอบกลับ" หรือในทางกลับกัน "การรับข้อความ - การส่งข้อความตอบกลับ" ในทางกลับกัน การรับและส่งจะอธิบายโดยองค์ประกอบที่ซ้อนกัน และ และข้อความแสดงข้อผิดพลาดคือองค์ประกอบ - ข้อความที่ได้รับและส่งต้องมีองค์ประกอบอธิบายอยู่แล้ว ,องค์ประกอบ , และ อ้างถึงพวกเขาด้วยแอตทริบิวต์ข้อความของพวกเขา

? - แสดงรายการองค์ประกอบที่ซ้อนกัน ชุดของพอร์ตที่เกี่ยวข้องกับบริการเว็บเดียว พอร์ตเดียวกันสามารถเชื่อมโยงกับบริการต่างๆ ได้

? - อธิบายรูปแบบเฉพาะสำหรับการส่งข้อความ: โปรโตคอล เช่น SOAP หรือ HTTP, วิธีการบรรจุข้อความ, ประเภทของเนื้อหา: HTML, XML หรือข้อความประเภท MIME อื่น แต่ละองค์ประกอบสามารถเชื่อมโยงกับองค์ประกอบดังกล่าวได้หลายรายการ หนึ่งรายการสำหรับแต่ละวิธีการส่งต่อ องค์ประกอบนี้มีองค์ประกอบที่กำหนดไว้ในสคีมาโปรโตคอลที่เลือก

? < service >- ระบุตำแหน่งของบริการบนเว็บเป็นหนึ่งพอร์ตหรือมากกว่า แต่ละพอร์ตอธิบายโดยองค์ประกอบที่ซ้อนกัน ประกอบด้วยที่อยู่ของอินเทอร์เฟซบริการเว็บที่ระบุตามกฎที่เลือกในองค์ประกอบ วิธีจัดส่ง.

นอกจากองค์ประกอบหลักทั้ง 6 ประการนี้แล้ว ยังมีองค์ประกอบเสริมอีก 2 องค์ประกอบอีกด้วย

? - รวมไฟล์ XSD คำอธิบาย WSDL หรือไฟล์ WSDL อื่น

ความคิดเห็น สามารถรวมไว้ในองค์ประกอบใดก็ได้

คำอธิบาย WSDL

เราสามารถพูดได้ว่าธาตุต่างๆ , และ โดยจะแสดงให้เห็นว่าบริการบนเว็บที่อธิบายไว้มีอะไรบ้าง บริการใดบ้างที่มีให้ วิธีจัดระเบียบบริการ และข้อมูลประเภทใดที่บริการเหล่านี้มี

องค์ประกอบ อธิบายว่าบริการเว็บถูกนำไปใช้อย่างไร โปรโตคอลการส่งข้อความคืออะไร: HTTP, SMTP หรืออื่นๆ และยังระบุอีกด้วย ข้อกำหนดทางเทคนิคการถ่ายโอนข้อมูล

ในที่สุดองค์ประกอบ แสดงที่ตั้งของบริการบนเว็บโดยการเชื่อมโยงคำอธิบาย พร้อมที่อยู่บริการเว็บเฉพาะ

โครงสร้างของเอกสาร 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" />

ชื่อ = "EchoServService">

Binding="tns:EchoServiceSoapBinding" name="EchoService"> ที่ตั้ง=

"http://localhost:8080/axis/EchoService.jws" />

ในรายการ 4.2 เราอยู่ในองค์ประกอบ เรากำหนดคำนำหน้าของเนมสเปซทั้งหมดที่เราต้องการ ต่อไป เราจะอธิบายคำขอและการตอบกลับเป็นสององค์ประกอบ - เราตั้งชื่อให้พวกเขาว่า "getEchoRequest" และ "getEchoResponse" คำร้องขอประกอบด้วยหนึ่งอาร์กิวเมนต์ประเภท xsd: string ประเภทนี้ถูกกำหนดในภาษา XSD เราตั้งชื่ออาร์กิวเมนต์เป็น name req ซึ่งเหมือนกับชื่ออาร์กิวเมนต์ของเมธอด getEcho() เราตั้งชื่อค่าที่ส่งคืนโดยเมธอด return ประเภทของมันคือ xsd: string

ชื่อ "getEchoRequest" และ "getEchoResponse" ถูกใช้ในองค์ประกอบถัดไป เพื่อระบุพารามิเตอร์อินพุตและเอาต์พุตของบริการบนเว็บ มันมีองค์ประกอบหนึ่ง - ซึ่งหมายความว่าบริการบนเว็บให้บริการหนึ่งรายการซึ่งมีชื่อ "getEcho" เหมือนกับชื่อของวิธีการดำเนินการบริการนั้น องค์ประกอบระบุอินพุต และวันหยุด พารามิเตอร์บริการ แล้วธาตุ เราได้ระบุวิธีหนึ่งในการส่งข้อความ - ข้อความ SOAP ไปที่ สไตล์ขั้นตอน, ส่งโดย โปรโตคอล HTTP, องค์ประกอบนั้นชี้ไปที่อะไร

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 จึงเริ่มมีการพัฒนามาตรฐาน แนวคิดพื้นฐานของมาตรฐานนี้คืออะไร:
  1. สบู่- ก่อนที่จะเรียกขั้นตอนระยะไกล คุณต้องอธิบายการโทรนี้ในไฟล์ XML ในรูปแบบ SOAP SOAP เป็นเพียงหนึ่งในมาร์กอัป XML จำนวนมากที่ใช้ในบริการเว็บ ทุกอย่างที่เราต้องการส่งที่ไหนสักแห่งผ่าน HTTP จะถูกแปลงเป็นคำอธิบาย XML SOAP ก่อน จากนั้นจึงยัดลงในแพ็กเก็ต HTTP และส่งไปยังคอมพิวเตอร์เครื่องอื่นบนเครือข่ายผ่าน TCP/IP
  2. WSDL- มีบริการเว็บเช่น โปรแกรมที่สามารถเรียกวิธีการจากระยะไกลได้ แต่มาตรฐานกำหนดให้โปรแกรมนี้ต้องมีคำอธิบายว่า "ใช่ คุณพูดถูก นี่คือบริการทางเว็บจริงๆ และคุณสามารถเรียกใช้วิธีการดังกล่าวได้จากบริการดังกล่าว" คำอธิบายนี้แสดงด้วยไฟล์ XML อื่นซึ่งมีรูปแบบที่แตกต่างกัน คือ WSDL เหล่านั้น. WSDL เป็นเพียงไฟล์ XML ที่อธิบายบริการบนเว็บและไม่มีอะไรเพิ่มเติม
ทำไมคุณถามสั้น ๆ ? คุณไม่สามารถเจาะจงมากขึ้นได้ไหม? อาจเป็นไปได้ แต่การทำเช่นนี้ คุณจะต้องหันไปหาหนังสือเช่น 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 จากไคลเอนต์ไปถึง) เราจำเป็นต้องทำสิ่งต่อไปนี้:
  1. อธิบายอินเทอร์เฟซของบริการบนเว็บของเรา
  2. ใช้อินเทอร์เฟซนี้
  3. เปิดตัวบริการบนเว็บของเรา
  4. เขียนไคลเอนต์และเรียกใช้วิธีการบริการเว็บที่ต้องการจากระยะไกล
คุณสามารถเปิดบริการเว็บได้หลายวิธี: อธิบายคลาสด้วยวิธีการหลักและเปิดบริการเว็บโดยตรงในฐานะเซิร์ฟเวอร์ หรือปรับใช้กับเซิร์ฟเวอร์เช่น 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);

// ฮูเร่! ตอนนี้คุณสามารถโทร

// ฮูเร่! ตอนนี้คุณสามารถเรียกวิธีระยะไกลได้แล้ว รปภ.

หัวข้อนี้เป็นการอธิบายสั้นๆ เกี่ยวกับบริการทางเว็บ ฉันจะพูดอีกครั้งว่าสิ่งที่ฉันเขียนส่วนใหญ่เป็นการเดาของฉันว่ามันทำงานอย่างไร ดังนั้นคุณไม่ควรเชื่อใจฉันมากเกินไป ฉันจะขอบคุณถ้าผู้รอบรู้คอยตักเตือนฉัน เพราะเมื่อนั้นฉันจะได้เรียนรู้อะไรบางอย่างบทความก่อนหน้านี้
กำลังอัพเดตเฟิร์มแวร์สำหรับสมาร์ทโฟน Samsung Galaxy กำลังเตรียมเฟิร์มแวร์บทความถัดไป