ไฟล์ WSDL: มันกินกับอะไร? สบู่อุ้ย. ภาษาคำอธิบายบริการเว็บ (WSDL): Andrew Troelsen

คำนำ

ลูกค้าของลูกค้าสอบถามลูกค้า ไฟล์ xsdสำหรับโครงสร้างที่ส่งผ่านบริการเว็บที่ใช้งาน ลูกค้าตอบสนองด้วยการเชิญลูกค้าของลูกค้าให้สร้าง WSDL ที่. ทันใดนั้น “โดยไม่ได้ตั้งใจ” ความต้องการเกิดขึ้นไม่เพียงแต่สร้างสคีมา xsd สำหรับการตรวจสอบความถูกต้องของข้อมูล แต่ยังรวมถึง “WSDL ทั้งหมด” โดยปกติแล้ว WSDL จะใช้สำหรับ SOAP แต่เราใช้ REST...

ก่อนหน้านี้ฉันเขียนเกี่ยวกับ

การแนะนำ

คำว่าบริการเว็บมักจะเกี่ยวข้องกับบริการตามการดำเนินการหรือการดำเนินการตามมาตรฐาน SOAP หรือ WS* เช่น WS-Addressing หรือ WS-Security คำว่าบริการเว็บ REST มักจะหมายถึงสถาปัตยกรรมตามทรัพยากรของบริการเว็บที่สื่อสาร XML ผ่าน HTTP สถาปัตยกรรมแต่ละรูปแบบเหล่านี้ก็มี สถานที่ของตัวเองแต่จนกระทั่งเมื่อไม่นานมานี้ มาตรฐาน WSDL ไม่รองรับทั้งสองสไตล์นี้ การเชื่อมโยง WSDL 1.1 HTTP ไม่เพียงพอที่จะอธิบายการโต้ตอบด้วย โดยใช้ XMLผ่าน HTTP เช่น ไม่มีวิธีที่เป็นทางการในการอธิบายบริการเว็บ REST โดยใช้ WSDL การเผยแพร่มาตรฐาน WSDL 2.0 (ซึ่งได้รับการพัฒนาโดยคำนึงถึงความจำเป็นในการอธิบายบริการเว็บ REST) ​​ในสถานะคำแนะนำ ทั่วโลก Web Consortium (W3C) ได้จัดเตรียมภาษาสำหรับอธิบายบริการเว็บ REST

REST เป็นรูปแบบสถาปัตยกรรมที่ถือว่าเว็บเป็นแอปพลิเคชันที่เน้นทรัพยากรเป็นศูนย์กลาง ในทางปฏิบัติแล้ว นี่หมายความว่าทุก URL ในแอปพลิเคชัน RESTful แสดงถึงทรัพยากร URL ง่ายต่อการเข้าใจและจดจำ ตัวอย่างเช่น ร้านหนังสืออาจกำหนด URL http://www.bookstore.com/books/ สำหรับรายชื่อหนังสือที่ขาย และ http://www.bookstore.com/books/0321396855/ สำหรับรายละเอียดเกี่ยวกับหนังสือเล่มใดเล่มหนึ่งด้วย ISBN 0321396855 สิ่งนี้แตกต่างกับแอปพลิเคชันที่เน้นการดำเนินการเป็นหลัก โดยปกติแล้วจะมี URL ที่ยาวและซับซ้อนซึ่งอธิบายการดำเนินการที่จะดำเนินการ เช่น http://www.bookstore.com/action/query?t=b&id=11117645532&qp=0321396855 พารามิเตอร์การค้นหาใช้เพื่อเลือกข้อมูลที่ต้องการ จากตัวอย่างร้านหนังสือ การระบุพารามิเตอร์หัวเรื่องจะจำกัดหัวเรื่องของหนังสือ ตัวอย่างเช่น เรื่องราวเกี่ยวกับฟิสิกส์หรือนักสืบ หรือตัวอย่าง URL http://www.bookstore.com/books/?subject=computers/eclipse - คำขอส่งคืนรายการหนังสือเกี่ยวกับแพลตฟอร์ม Eclipse

คำว่า REST ได้รับการประกาศเกียรติคุณจาก Roy Fielding ในวิทยานิพนธ์ระดับปริญญาเอกของเขา เขามองว่าไฮเปอร์ลิงก์เป็นวิธีหนึ่งในการเปลี่ยนแปลง (จัดเก็บ) สถานะของแอปพลิเคชัน ไฮเปอร์ลิงก์จะถูกจัดเก็บไว้ในทรัพยากรของแอปพลิเคชันและเป็นวิธีการเปลี่ยนสถานะของแอปพลิเคชัน โดยเปลี่ยนเส้นทางจากสถานะหนึ่งไปอีกสถานะหนึ่ง โดยทั่วไปไฮเปอร์ลิงก์ใน (X)HTML มีไว้สำหรับมนุษย์ แต่ไม่ได้ใช้ใน XML ซึ่งมีไว้สำหรับการประมวลผลด้วยเครื่องจักร เช่นเดียวกับ (X)HTML บริการเว็บ REST ใช้ไฮเปอร์ลิงก์ใน XML

แอปพลิเคชันเว็บแบบดั้งเดิมเข้าถึงทรัพยากรผ่านการดำเนินการ HTTP GET หรือ POST แอปพลิเคชัน RESTfull ทำงานร่วมกับทรัพยากรในรูปแบบ "สร้าง อ่าน อัปเดต และลบ (CRUD)" โดยใช้ ความสามารถเต็มเปี่ยมโปรโตคอล HTTP (POST, GET, PUT และ DELETE)

อีกสิ่งหนึ่ง หมายเหตุสำคัญเกี่ยวกับแอปพลิเคชัน RESTful: แอปพลิเคชัน RESTful ควรไม่มีสถานะ ซึ่งหมายความว่าแอปพลิเคชัน REST จะไม่รักษาสถานะเซสชันใด ๆ บนฝั่งเซิร์ฟเวอร์ ข้อมูลทั้งหมดที่จำเป็นในการดำเนินการตามคำขอจะถูกส่งไปในคำขอนั้นเอง (ดังนั้นเซิร์ฟเวอร์จะต้องตอบสนองต่อคำขอซ้ำในลักษณะเดียวกัน หมายเหตุของผู้แปล) ดังนั้นไคลเอนต์สามารถแคชทรัพยากรที่ได้รับซึ่งสามารถเร่งความเร็วของแอปพลิเคชันได้อย่างมากซึ่งบริการอนุญาตอย่างชัดเจน หากต้องการเรียนรู้เพิ่มเติมเกี่ยวกับ REST โปรดดูลิงก์ไปยังบทความ

WSDL และส่วนที่เหลือ

WSDL มีรายละเอียดทั้งหมดเกี่ยวกับบริการบนเว็บ ได้แก่:

    URL บริการเว็บ
    กลไกการสื่อสารที่เว็บเซอร์วิสเข้าใจ
    การดำเนินการที่บริการเว็บสามารถทำได้
    โครงสร้างข้อความบริการเว็บ

ลูกค้าสามารถใช้รายละเอียดที่ระบุไว้เพื่อโต้ตอบกับบริการได้

WSDL 2.0 ได้รับการประกาศเป็นคำแนะนำของ W3C ในเดือนมิถุนายน พ.ศ. 2550 มาตรฐาน WSDL เวอร์ชันนี้ได้รับการเผยแพร่เพื่อแก้ไขปัญหาเกี่ยวกับมาตรฐาน WSDL 1.1 ซึ่งหลายปัญหาถูกระบุโดยองค์กร บริการบนเว็บการทำงานร่วมกัน (WS-I) นอกจากนี้ WSDL 2.0 ยังได้รับการปรับปรุงอีกด้วย การสนับสนุน HTTPการผูกมัด

WSDL เองคือ XML ซึ่งเป็นชุดย่อยที่อธิบายบริการเว็บอย่างเป็นทางการ คิดว่าคำอธิบาย WSDL ของบริการเว็บเป็นสัญญา API กับไคลเอ็นต์ WSDL ระบุที่อยู่ วิธีการส่งข้อมูล อินเทอร์เฟซ และประเภทข้อความที่ยอมรับได้ของบริการเว็บ กล่าวโดยสรุป คำอธิบาย WSDL ประกอบด้วยข้อมูลทั้งหมดที่ไคลเอ็นต์จำเป็นต้องใช้ในการใช้บริการเว็บ

การบังคับใช้ของ WSDL ขยายไปไกลกว่าการใช้เป็นสัญญา API เนื่องจากเป็นคำจำกัดความที่เป็นทางการ ซอฟต์แวร์จึงสามารถใช้ WSDL เพื่อทำให้การใช้งานบริการเว็บง่ายขึ้นสำหรับการดำเนินการต่างๆ เช่น:

  • กำลังสร้าง ซอร์สโค้ดแอปพลิเคชันไคลเอนต์และเซิร์ฟเวอร์สำหรับบริการเว็บในภาษาการเขียนโปรแกรมที่แตกต่างกัน
  • การเผยแพร่บริการเว็บ
  • การทดสอบบริการเว็บแบบไดนามิก

ส่วนใหญ่ ซอฟต์แวร์สำหรับการทำงานกับบริการเว็บรวมถึงการรองรับ WSDL 1.1 เมื่อเร็ว ๆ นี้ จำนวนเครื่องมือพัฒนาบริการเว็บที่รองรับ WSDL 2.0 มีการเติบโต โครงการ เว็บอาปาเช่บริการประกอบด้วยสองโครงการย่อยที่รองรับ WSDL 2.0 ในปัจจุบัน Woden เป็นตัวตรวจสอบพาร์เซอร์ WSDL 2.0 ที่ใช้ Java โครงการบริการเว็บ Apache ยังมีการแปลง XSL (XSLT) WSDL 2.0 ที่เรียกว่า WSDL 2.0 เครื่องพิมพ์สวยทำให้มนุษย์อ่านง่ายขึ้น เอกสาร WSDL- Axis2 เป็นกลไกบริการเว็บยอดนิยม (รวมถึงจาก Apache) ที่สร้างโค้ด Java ไคลเอ็นต์และเซิร์ฟเวอร์จากเอกสาร WSDL 2.0

คำอธิบายของบริการเว็บ REST โดยใช้ WSDL 2.0

คุณสร้างร้านหนังสือที่มี URL ขั้นสูง: http://www.bookstore.com คุณได้สร้างบริการเว็บ REST สองรายการแล้ว:

  • รายการหนังสือ - บริการรับรายการหนังสือที่คุณขาย
  • รายละเอียดหนังสือ - บริการรับข้อมูลเกี่ยวกับหนังสือเล่มใดเล่มหนึ่ง

การตอบสนองจะถูกส่งกลับในเอกสาร XML

องค์ประกอบ อินเตอร์เฟซกำหนดรายการการดำเนินการบริการเว็บ รวมถึงคำอธิบายของอินพุต เอาต์พุต และข้อความแสดงข้อผิดพลาดสำหรับการดำเนินการ รวมถึงลำดับการส่งข้อมูล

องค์ประกอบ ผูกพันกำหนดวิธีการสื่อสารระหว่างไคลเอนต์และบริการเว็บ ในกรณีของบริการเว็บ REST นั้น HTTP จะถูกระบุเป็นวิธีการสื่อสาร

องค์ประกอบบริการเชื่อมโยงที่อยู่บริการเว็บกับอินเทอร์เฟซและการผูกข้อมูลเฉพาะ (นั่นคือ ตั้งค่าความสอดคล้องระหว่าง URL ของการดำเนินการบริการเว็บและองค์ประกอบ ผูกพัน).

ผูกรายการหนังสือกับ HTTP

องค์ประกอบ ผูกพันระบุการเชื่อมโยงบริการเว็บกับโปรโตคอลการถ่ายโอนข้อมูลเฉพาะ เพื่อผูกหนังสือ รายการบริการสำหรับ HTTP คุณต้องระบุค่า http://www.w3.org/ns/wsdl/http สำหรับแอตทริบิวต์ พิมพ์องค์ประกอบ ผูกพัน.

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

วิธีการสื่อสาร HTTP มี 4 วิธี

  • ลบ

บริการรายการหนังสืออ่านคำขอและดำเนินการตามนั้นโดยใช้ HTTP GET ติดตั้ง วิธีการรับสำหรับองค์ประกอบ operatioin โดยใช้แอตทริบิวต์วิธีการจากเนมสเปซ WSDL 2.0 HTTP หากต้องการใช้แอตทริบิวต์นี้ คุณต้องกำหนดเนมสเปซ http://www.w3.org/ns/wsdl/http บนองค์ประกอบก่อน คำอธิบาย.

บริการผูกรายการหนังสือมีการกำหนดไว้ในรายการต่อไปนี้ ระบุเลย ผูกพันในองค์ประกอบ จุดสิ้นสุด: tns:BookListHTTPBinding.

บริการรายการหนังสือของร้านหนังสือ

คำจำกัดความของการดำเนินงานบริการรายการหนังสือ

จนถึงตอนนี้ คุณได้เรียนรู้วิธีจัดการและสื่อสารกับบริการบนเว็บรายการหนังสือแล้ว ถัดไป คุณระบุการดำเนินการบริการรายการหนังสือ ซึ่งจะอธิบายว่าบริการรายการหนังสือทำอะไร

ดังนั้นคุณได้เรียนรู้วิธีตั้งค่าที่อยู่และตั้งค่าการเชื่อมโยง (วิธีการสื่อสาร) สำหรับบริการเว็บแล้ว ถัดไป คุณต้องตั้งค่าการดำเนินการบริการ ซึ่งจะกำหนดว่าบริการเว็บรายการหนังสือทำอะไร

องค์ประกอบอินเทอร์เฟซและองค์ประกอบการดำเนินงานย่อยใช้เพื่อกำหนดการดำเนินงานบริการ ในกรณีของรายการหนังสือ คุณกำหนดการดำเนินการเดียว getBookList ที่ส่งคืนรายการหนังสือ

ถัดไป กำหนดแอตทริบิวต์สามรายการสำหรับองค์ประกอบการดำเนินงาน:

ลวดลาย

ใช้เพื่อระบุรูปแบบการส่งข้อความ รูปแบบการแลกเปลี่ยนข้อความ(MEP) เพื่อการปฏิบัติการ MEP กำหนดลำดับของข้อความสำหรับการปฏิบัติงานและทิศทาง ในกรณีนี้ คุณต้องระบุค่า http://www.w3.org/ns/wsdl/in-out เพื่อระบุว่าบริการเว็บได้รับข้อความอินพุตหนึ่งข้อความเพื่อขอรายชื่อหนังสือ และส่งข้อความเอาต์พุตหนึ่งข้อความเพื่อขอ รายการหนังสือ เพื่อสนับสนุน MEP นี้ ให้ระบุลูกๆ ป้อนข้อมูลและ เอาท์พุทสำหรับองค์ประกอบ การดำเนินการ- องค์ประกอบเหล่านี้ใช้องค์ประกอบที่อธิบายไว้ในสคีมา XML เพื่อกำหนดโครงสร้างข้อความ รายละเอียดในส่วนถัดไป

สไตล์

ใช้เพื่อระบุข้อมูลเพิ่มเติมเกี่ยวกับงาน ระบุค่า http://www.w3.org/ns/wsdl/style/iri ซึ่งกำหนดข้อจำกัดเกี่ยวกับเนื้อหาขององค์ประกอบอินพุต เช่น กำหนดให้ใช้เฉพาะองค์ประกอบ XML schema

wsdlx:ปลอดภัย

wsdlx:safe: จากเนมสเปซส่วนขยาย WSDL คุณลักษณะนี้ประกาศว่าการดำเนินการนี้เป็น idempotent การดำเนินการประเภทนี้ไม่ได้แก้ไขทรัพยากรและสามารถเรียกได้หลายครั้งโดยให้ผลลัพธ์เดียวกัน หากต้องการใช้องค์ประกอบนี้ ให้ประกาศเนมสเปซส่วนขยาย WSDL http://www.w3.org/ns/wsdl-extensions บนองค์ประกอบคำอธิบาย

คุณลักษณะนี้มาจากเนมสเปซส่วนขยาย WSDL โดยจะกำหนดว่าการดำเนินการคือ idempotent- การดำเนินการนี้ไม่ได้แก้ไขทรัพยากร จึงสามารถเรียกได้หลายครั้งโดยให้ผลลัพธ์เดียวกัน หากต้องการใช้องค์ประกอบนี้ คุณต้องประกาศส่วนขยาย WSDL เนมสเปซ http://www.w3.org/ns/wsdl-extensions ในองค์ประกอบรูท (องค์ประกอบคำอธิบาย)

คุณสามารถค้นหารูปแบบการแลกเปลี่ยนข้อความ สไตล์ และคำจำกัดความ wsdlx:safe ที่กำหนดไว้ล่วงหน้าได้ที่ WSDL 2.0 ส่วนที่ 2: ส่วนเสริม

ด้านล่างนี้คือคำจำกัดความของบริการรายการหนังสือพร้อมคำอธิบายเพิ่มเติม อินเตอร์เฟซ- หลังจากเพิ่มอินเทอร์เฟซ ตอนนี้คุณสามารถเปลี่ยนองค์ประกอบการดำเนินการเชื่อมโยงเพื่อระบุลิงก์ไปยังที่อธิบายไว้ได้ อินเตอร์เฟซและ การดำเนินการ.

การเชื่อมโยง RESTful HTTP สำหรับบริการรายการหนังสือ บริการรายการหนังสือของร้านหนังสือ

การกำหนดข้อความบริการการดำเนินการรายการหนังสือ

บริการเว็บรายการหนังสือใช้สองข้อความ: อินพุตและเอาต์พุต คุณต้องอธิบายโครงสร้างของข้อความเหล่านี้เพื่อให้โปรแกรมไคลเอนต์รู้ว่าจะส่งอะไรไปยังบริการและคาดหวังอะไรกลับ

WSDL 2.0 รองรับระบบหลายประเภทสำหรับการอธิบายเนื้อหาข้อความ แต่ XML schema เป็นระบบเดียวที่ใช้งานอยู่ ส่วนนี้ไม่ครอบคลุมรายละเอียดของสคีมา XML XML schema ใช้ในแอปพลิเคชันอื่นๆ มากมาย เช่น WSDL 1.1 และมีบทความดีๆ เกี่ยวกับเรื่องนี้มากมาย ส่วนนี้เน้นถึงวิธีการใช้ XML schema สำหรับรายการหนังสือ REST Web service และวิธีใช้แอตทริบิวต์เพิ่มเติมที่กำหนดโดย WSDL 2.0 เพื่อใส่คำอธิบายประกอบแอตทริบิวต์ schema

WSDL 2.0 รองรับระบบการกำหนดประเภทหลายประเภท แต่ในทางปฏิบัติจะใช้เฉพาะ XML schema เท่านั้น บทความนี้ไม่ได้ลงรายละเอียดเกี่ยวกับ XML schema XML schema ใช้ในแอปพลิเคชันอื่นๆ มากมาย เช่น WSDL 1.1 และมีอีกมากมาย บทความดีๆเกี่ยวกับเขา - ส่วนนี้สาธิตการใช้ XML schema ที่เกี่ยวข้องกับตัวอย่างเฉพาะของบริการ REST รายการหนังสือ ตลอดจนการใช้คุณลักษณะเพิ่มเติมที่กำหนดไว้ใน WSDL 2.0 สำหรับคำอธิบายประกอบคุณลักษณะ schema

หากต้องการอธิบาย 2 ข้อความสำหรับรายการหนังสือ คุณต้องอธิบายองค์ประกอบส่วนกลาง 2 รายการ

  • getBookListหมายถึงข้อความอินพุต ประกอบด้วยลำดับขององค์ประกอบ รวมถึงพารามิเตอร์คำขอแต่ละรายการที่อนุญาตสำหรับบริการ: ผู้มีอำนาจ, ตำแหน่ง, ผู้จัดพิมพ์, หัวเรื่องและ ภาษา- เฉพาะองค์ประกอบเท่านั้นที่สามารถใช้ได้ภายในข้อความ getBookList เนื่องจากมีการเลือกสไตล์ IRI สำหรับการทำงานของอินเทอร์เฟซ
  • รายการหนังสือแสดงถึงข้อความเอาท์พุต ประกอบด้วยลำดับองค์ประกอบหนังสือ องค์ประกอบหนังสือแต่ละเล่มจะมีแอตทริบิวต์ชื่อและ URL ตามลำดับ แอตทริบิวต์ชื่อเป็นแบบอธิบายตนเอง แอตทริบิวต์ url คือลิงก์ไปยังบริการรายละเอียดหนังสือที่ส่งคืน ข้อมูลรายละเอียดเกี่ยวกับหนังสือเล่มใดเล่มหนึ่ง

คำจำกัดความแอตทริบิวต์ url ของคุณใช้แอตทริบิวต์ 2 รายการจากเนมสเปซส่วนขยาย WSDL แอ็ตทริบิวต์ wsdlx:interface และ wsdlx:binding ระบุอินเทอร์เฟซและการเชื่อมโยงสำหรับเซอร์วิส ซอฟต์แวร์สามารถใช้ข้อมูลนี้เพื่อค้นหาบริการโดยอัตโนมัติ หากต้องการใช้แอ็ตทริบิวต์เหล่านี้ ให้ระบุเนมสเปซส่วนขยาย WSDL สำหรับองค์ประกอบ สคีมา- รวมถึงเนมสเปซรายละเอียดหนังสือจากคำอธิบาย WSDL 2.0 ด้วย

สคีมา XML สำหรับบริการรายการหนังสือมีดังต่อไปนี้

องค์ประกอบคำขอสำหรับบริการรายการหนังสือ องค์ประกอบการตอบสนองสำหรับบริการรายการหนังสือ

หากต้องการอ้างอิงองค์ประกอบอินพุตและเอาต์พุต คุณต้องนำเข้าสคีมาลงในเอกสาร WSDL ของคุณ หากต้องการนำเข้าสคีมา ให้ใช้องค์ประกอบการนำเข้าสคีมาในส่วนประเภทดังแสดงในรายการด้านล่าง นอกจากนี้ คุณต้องเพิ่มการอ้างอิงไปยังองค์ประกอบ getBookList และ Booklist ในองค์ประกอบอินพุตและเอาต์พุตการดำเนินการอินเทอร์เฟซ และเพิ่มเนมสเปซ XML schema ของรายการหนังสือให้กับองค์ประกอบรูท WSDL

พร้อม WSDL สำหรับบริการเว็บรายการหนังสือ

นี่คือคำอธิบาย WSDL 2.0 ของรายการบริการร้านหนังสือตัวอย่างสำหรับการรับข้อมูลหนังสือ การดำเนินการนี้ส่งคืนรายการหนังสือ การเชื่อมโยง RESTful HTTP สำหรับบริการรายการหนังสือ บริการรายการหนังสือของร้านหนังสือ

บันทึกของผู้แปล

ฉันใช้เสรีภาพในการไม่แปลบทสรุปและลิงก์ ดูผู้เขียนทั้งสอง ในบทความต้นฉบับ ต้องบอกว่าภาษาต้นฉบับยากมาก อย่างไรก็ตามฉันหวังว่าบทความนี้จะมีประโยชน์

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

การแนะนำ

เราต้องเริ่มต้นด้วยสาเหตุที่แนวคิดของบริการเว็บถูกสร้างขึ้น เมื่อแนวคิดนี้ปรากฏขึ้นในโลก เทคโนโลยีก็มีอยู่แล้วที่อนุญาตให้แอปพลิเคชันโต้ตอบในระยะไกล โดยที่โปรแกรมหนึ่งสามารถเรียกวิธีการบางอย่างในอีกโปรแกรมหนึ่ง ซึ่งสามารถเปิดใช้งานบนคอมพิวเตอร์ที่ตั้งอยู่ในเมืองอื่นหรือแม้แต่ประเทศอื่นได้ ทั้งหมดนี้เรียกสั้น ๆ ว่า RPC (การเรียกขั้นตอนระยะไกล) ตัวอย่าง ได้แก่ เทคโนโลยี CORBA และสำหรับ Java - RMI (Remote Method Invoking) และทุกอย่างดูเหมือนจะดีในตัว โดยเฉพาะใน CORBA เพราะ... คุณสามารถทำงานกับมันในภาษาการเขียนโปรแกรมใดก็ได้ แต่ยังมีบางอย่างขาดหายไป ฉันเชื่อว่าข้อเสียของ CORBA ก็คือมันทำงานผ่านตัวมันเองบางส่วนได้ โปรโตคอลเครือข่ายแทน HTTP ง่าย ๆซึ่งจะพอดีกับไฟร์วอลล์ใด ๆ แนวคิดของบริการเว็บคือการสร้าง RPC ที่จะแทรกลงในแพ็กเก็ต HTTP จึงเริ่มมีการพัฒนามาตรฐาน แนวคิดพื้นฐานของมาตรฐานนี้คืออะไร:
  1. สบู่- ก่อนที่จะเรียกขั้นตอนระยะไกล คุณต้องอธิบายการโทรนี้ในไฟล์ XML ในรูปแบบ 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 ( // เราบอกว่าวิธีนี้สามารถเรียกจากระยะไกลได้พารามิเตอร์ style ใช้กับค่าที่ระบุว่าบริการเว็บจะไม่ทำงานผ่านข้อความเอกสาร แต่เป็น RPC แบบคลาสสิกเช่น เพื่อเรียกวิธีการ ลองใช้ตรรกะอินเทอร์เฟซของเราและสร้างคลาส HelloWebServiceImpl ในแพ็คเกจของเรา โดยวิธีการที่ฉันทราบว่าการสิ้นสุดคลาสด้วย Impl เป็นแบบแผนใน Java ตามที่กำหนดการใช้งานอินเทอร์เฟซ (Impl - จากคำว่า การใช้งาน เช่น การใช้งาน) นี่ไม่ใช่ข้อกำหนดและคุณมีอิสระที่จะตั้งชื่อคลาสตามที่คุณต้องการ แต่ต้องมีมารยาทที่ดี: package ru ชวารัช เป็น; // คำอธิบายประกอบแบบเดียวกับเมื่ออธิบายอินเทอร์เฟซนำเข้า javax. เจดับบลิว. บริการเว็บ; // แต่ที่นี่ใช้กับพารามิเตอร์ endpointInterface // บ่งชี้ ชื่อเต็มคลาสอินเทอร์เฟซของบริการเว็บของเรา@บริการเว็บ (endpointInterface= "ru.javarush.ws.HelloWebService") คลาสสาธารณะ HelloWebServiceImpl ใช้ HelloWebService ( @Override public String getHelloString (ชื่อสตริง) ( //ก็แค่กลับมาทักทายกลับ "สวัสดี" + ชื่อ + "!" - ) ) มาเปิดตัวบริการเว็บของเราในฐานะเซิร์ฟเวอร์อิสระเช่น โดยไม่ต้องมีส่วนร่วมของ Tomcat และเซิร์ฟเวอร์แอปพลิเคชันใด ๆ (นี่คือหัวข้อสำหรับการสนทนาแยกต่างหาก) เมื่อต้องการทำเช่นนี้ในโครงสร้างโครงการในโฟลเดอร์ srcมาสร้างแพ็คเกจ ru.javarush.endpoint กัน และในนั้นเราจะสร้างคลาส HelloWebServicePublisher ด้วยวิธีการหลัก: package ru ชวารัช จุดสิ้นสุด; // คลาสสำหรับการรันเว็บเซิร์ฟเวอร์พร้อมบริการบนเว็บนำเข้า javax. xml. ส. จุดสิ้นสุด; // คลาสของบริการเว็บของเรานำเข้า ru. ชวารัช ส. สวัสดีWebServiceImpl; HelloWebServicePublisher ระดับสาธารณะ ( public static void main (String... args) ( // เริ่มเว็บเซิร์ฟเวอร์บนพอร์ต 1986 // และไปยังที่อยู่ที่ระบุในอาร์กิวเมนต์แรก// เริ่มบริการเว็บที่ส่งผ่านในอาร์กิวเมนต์ที่สอง จุดสิ้นสุด เผยแพร่("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 ในแอตทริบิวต์ name QName qname = QName ใหม่ ("http://ws.site/" , "HelloWebServiceImplService" ) ; // ตอนนี้เราสามารถเข้าถึงแท็กบริการในคำอธิบาย wsdl แล้ว บริการ บริการ = บริการ สร้าง (url, qname) ;//แล้วขึ้นไปถึงพอร์ตแท็กที่ซ้อนกันอยู่นั่นเอง // รับลิงก์ไปยังวัตถุบริการเว็บระยะไกลจากเรา HelloWebService สวัสดี = บริการ getPort(HelloWebService.class);

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

ระบบ. ออก. println (สวัสดี getHelloString ( "JavaRush" ) ) ; ) ) ฉันให้ความคิดเห็นสูงสุดเกี่ยวกับรหัสในรายการ ฉันไม่มีอะไรจะเพิ่ม ดังนั้นมาเริ่มกันเลย (Shift+F10) เราควรเห็นข้อความในคอนโซล: สวัสดี JavaRush! หากคุณไม่เห็น แสดงว่าคุณอาจลืมเริ่มบริการเว็บบทสรุป ในหัวข้อนี้ได้ถูกนำเสนอทัศนศึกษาระยะสั้น ไปยังบริการทางเว็บ ฉันจะพูดอีกครั้งว่าสิ่งที่ฉันเขียนส่วนใหญ่เป็นการเดาของฉันว่ามันทำงานอย่างไร ดังนั้นคุณไม่ควรเชื่อใจฉันมากเกินไป ฉันจะขอบคุณถ้า

WSDL (คนที่มีความรู้พวกเขาจะแก้ไขฉันเพราะแล้วฉันจะเรียนรู้บางสิ่งบางอย่าง WSDLรปภ. WSDLขยายได้ ซึ่งช่วยให้คุณสามารถอธิบายบริการและข้อความได้โดยไม่คำนึงถึงรูปแบบข้อความหรือโปรโตคอลเครือข่ายที่ใช้สำหรับการขนส่ง อย่างไรก็ตาม WSDL 1.1 มักใช้ร่วมกับ SOAP 1.1, HTTP GET/POST และ MIME เพราะ WSDLได้รับการพัฒนาร่วมกับ SOAP และบริษัทเดียวกันกับ Microsoft, Ariba และ IBM เข้าร่วมในการพัฒนา หากเราพิจารณาเอกสาร WSDLโดยสัญชาตญาณ เราสามารถพูดได้ว่าอนุญาต ตอบคำถาม 4 ข้อ:

1) คุณกำลังทำอะไร? คำตอบสำหรับคำถามนี้ให้ไว้ในรูปแบบที่เหมาะสมสำหรับทั้งการรับรู้ของมนุษย์และรูปแบบที่เครื่องรับรู้ คำตอบสำหรับคนในแท็ก:<ชื่อ/>, <เอกสารประกอบ/> สำหรับรถยนต์ -<ข้อความ/>, <ชนิดจุด>

2) คุณพูดภาษาอะไร? (คุณใช้ประเภทไหน?) ตอบในแท็ก:<ประเภท/>

3) ฉันจะสื่อสารกับคุณอย่างไร? (ลูกค้าจะเข้าถึงบริการเว็บได้อย่างไร): HTTP หรือ SMTP คำตอบอยู่ที่<ผูกพัน/>

4) ฉันจะหาคุณได้ที่ไหน? (ฉันจะหาบริการบนเว็บนี้ได้ที่ไหนหรือ URL คืออะไร) คำตอบคือ:<บริการ/>

โครงสร้าง:

เอกสาร WSDL แต่ละฉบับสามารถแบ่งออกเป็นสามส่วนเชิงตรรกะ:

1. การกำหนดประเภทข้อมูล - กำหนดประเภทของข้อความที่ส่งและรับโดยบริการ XML

2. การดำเนินงานที่เป็นนามธรรม - รายการการดำเนินการที่สามารถทำได้พร้อมข้อความ

3. การเชื่อมโยงบริการ - วิธีการส่งข้อความ

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

องค์ประกอบเอกสาร WSDL

มาอธิบายแท็ก WSDL ที่ใช้กันมากที่สุด:

แท็ก เป็นแท็กรูทของเอกสาร WSDL ทั้งหมด มันกำหนดหลายเนมสเปซ:

1)พื้นที่ชื่อเป้าหมายคือเนมสเปซของบริการบนเว็บของเรา

2) xmlns – เนมสเปซเอกสาร WSDL มาตรฐาน

3)xmlns: SOAP_ENC – เนมสเปซที่ใช้อธิบายการเข้ารหัส SOAP


4) xmlns: impl และ intf – เนมสเปซของการนำไปใช้และคำจำกัดความของบริการบนเว็บของเรา

· เอกสารคำจำกัดความบริการเว็บ

· เอกสารสำหรับการใช้บริการเว็บ

เพื่อความง่าย ตามกฎแล้วจะใช้ 1 ไฟล์ที่มีข้อมูลทั้งหมด

องค์ประกอบ - ให้ข้อมูลเกี่ยวกับข้อมูลที่ถ่ายโอนจากจุดสิ้นสุดหนึ่งไปยังอีกจุดหนึ่ง

เพื่ออธิบายการเรียก RPC คุณต้องสร้างข้อความอินพุตและข้อความเอาต์พุต

ภายในองค์ประกอบนี้ คุณสามารถระบุพารามิเตอร์วิธีการโดยใช้องค์ประกอบได้

องค์ประกอบ อธิบายและกำหนดการดำเนินการหรือวิธีการที่รองรับโดยบริการเว็บ

การดำเนินการสามารถมีข้อความอินพุตและข้อความแสดงข้อผิดพลาดได้

องค์ประกอบ - อธิบายวิธีการดำเนินการที่ระบุในประเภทพอร์ตที่จะถูกส่งผ่านเครือข่าย เพราะ องค์ประกอบใช้ประเภทพอร์ต โดยจะต้องระบุประเภทที่กำหนดไว้ก่อนหน้าในเอกสาร

องค์ประกอบ - ระบุตำแหน่งที่จะค้นหาบริการเว็บ

องค์ประกอบ นำเข้า - บ่อยครั้งที่องค์ประกอบบริการได้รับการจัดสรรให้กับเอกสาร wsdl ด้วยเหตุผลด้านการใช้งานจริง

เพื่อให้สามารถรวมเอกสาร wsdl หนึ่งฉบับเป็นเอกสารเดียวได้ จึงมีการใช้องค์ประกอบการนำเข้า ช่วยให้คุณสามารถรวมเอกสาร wsdl หนึ่งฉบับลงในอีกเอกสารหนึ่งได้

องค์ประกอบ ประเภท ช่วยให้คุณระบุประเภทของข้อมูลที่ส่งหากไม่ได้มาตรฐาน

WSDL รองรับ 4 โหมดการทำงาน:

· การดำเนินการทางเดียวหรือทางเดียว ข้อความจะถูกส่งไปยังจุดสิ้นสุดของบริการ ในกรณีนี้ การดำเนินการจะอธิบายด้วยข้อความอินพุตเพียงข้อความเดียวเท่านั้น

· การร้องขอการตอบสนอง – โหมดการร้องขอการตอบกลับ โหมดการทำงานนี้เป็นโหมดที่พบบ่อยที่สุด ในโหมดนี้ คำอธิบายการทำงานประกอบด้วยข้อความอินพุตและเอาต์พุตและข้อความแสดงข้อผิดพลาดเพิ่มเติม

· การดำเนินการประเภทการร้องขอและการตอบสนอง ในโหมดนี้ ตำแหน่งข้อมูลคือไคลเอ็นต์ของตำแหน่งข้อมูลอื่น รูปแบบการดำเนินการจะคล้ายกับโหมดการตอบสนองคำขอ แต่ข้อมูลเอาต์พุตจะแสดงรายการก่อนข้อมูลอินพุต

· การแจ้งเตือนการดำเนินงาน โหมดนี้เป็นอีกเวอร์ชันหนึ่งของการส่งข้อมูลแบบทางเดียวดั้งเดิม ซึ่งปลายทางจะส่งข้อความแทนที่จะรับ การดำเนินการมีเพียงข้อความเอาต์พุตเท่านั้น

องค์ประกอบส่วนขยายการผูกใช้เพื่อระบุไวยากรณ์เฉพาะสำหรับข้อความแสดงข้อผิดพลาดขาเข้า (3) และขาออก (4) (5) อาจมีการระบุข้อมูลระดับการดำเนินการ (2) และระดับการผูก (1) ไว้ด้วย

องค์ประกอบการเชื่อมโยงการดำเนินการประกอบด้วยข้อมูลสำหรับการดำเนินการที่มีชื่อเดียวกัน ประเภทที่เกี่ยวข้องท่าเรือ. อย่างไรก็ตาม ชื่อของการดำเนินการโดยทั่วไปจะไม่ซ้ำกัน (ตัวอย่าง: วิธีการ / ฟังก์ชันโอเวอร์โหลด - การใช้ชื่อเดียวกันกับลายเซ็นที่แตกต่างกัน) ดังนั้นจึงอาจไม่เพียงพอที่จะระบุการดำเนินการเป้าหมายของประเภทพอร์ตโดยไม่ซ้ำกัน ในกรณีดังกล่าว การดำเนินการเป้าหมายได้รับการแก้ไขโดยการระบุชื่อองค์ประกอบ wsdl:input และ wsdl:output เพิ่มเติมที่เหมาะสมโดยใช้แอ็ตทริบิวต์ name

ผูกพัน ควรติดตั้งโปรโตคอลเดียวเท่านั้น

ผูกพัน ไม่ควรมีข้อมูลที่อยู่

ท่าเรือ

พอร์ตกำหนดจุดสิ้นสุดเดียวโดยการตั้งค่าที่อยู่ที่จะเชื่อมโยง

  1. <wsdl:คำจำกัดความ .... >
  2. <wsdl:บริการ .... > *
  3. <wsdl:ท่าเรือ name = "nmtoken" การผูก = "qname"> *
  4. <-- extensibility element (1) -->
  5. wsdl:ท่าเรือ>
  6. wsdl:บริการ>
  7. wsdl:คำจำกัดความ>

แอตทริบิวต์ name ระบุชื่อที่ไม่ซ้ำกันระหว่างพอร์ตทั้งหมดภายในเอกสาร WSDL แอตทริบิวต์การผูกประเภท QName มีการอ้างอิงถึงการผูก (ดู)

องค์ประกอบส่วนขยาย (1) ใช้เพื่อระบุที่อยู่

ท่าเรือ ไม่ควรระบุมากกว่าหนึ่งที่อยู่

ท่าเรือ ไม่ควรมีข้อมูลผูกพันใด ๆ นอกเหนือจากที่อยู่

บริการ

บริการรวมกลุ่มพอร์ตที่เกี่ยวข้องเข้าด้วยกัน

  1. <wsdl:คำจำกัดความ .... >
  2. <wsdl:บริการชื่อ = "นาโนเมตร" > *
  3. <wsdl:ท่าเรือ .... /> *
  4. wsdl:บริการ>
  5. wsdl:คำจำกัดความ>

แอตทริบิวต์ชื่อระบุชื่อที่ไม่ซ้ำกันในบริการทั้งหมดที่กำหนดไว้ภายในเอกสาร WSDL

พอร์ตภายในบริการมีการเชื่อมต่อดังนี้:

  • พอร์ตต่างๆ จะไม่สื่อสารระหว่างกัน (นั่นคือ เอาต์พุตของพอร์ตหนึ่งไม่ใช่อินพุตของอีกพอร์ตหนึ่ง)
  • หากบริการมีหลายพอร์ตที่ใช้พอร์ตประเภทเดียวกันร่วมกัน แต่ใช้การเชื่อมโยงที่แตกต่างกันหรือมีที่อยู่ที่แตกต่างกัน พอร์ตเหล่านั้นจะเป็นพอร์ตสำรอง แต่ละพอร์ตดังกล่าวจะใช้พฤติกรรมที่เทียบเท่ากันทางตรรกะ (ภายในข้อจำกัดด้านการขนส่งและรูปแบบข้อความที่กำหนดโดยการเชื่อมโยงที่สอดคล้องกัน) สิ่งนี้ทำให้ไคลเอนต์สามารถเลือกพอร์ตเฉพาะสำหรับการสื่อสารตาม เกณฑ์ต่างๆ(รองรับโปรโตคอลการขนส่ง ฯลฯ )
  • เมื่อดูที่พอร์ต คุณสามารถกำหนดได้ว่าบริการรองรับพอร์ตประเภทใด จากข้อมูลนี้ ลูกค้าสามารถกำหนดความสามารถในการโต้ตอบกับบริการเฉพาะได้ สิ่งนี้มีประโยชน์หากมีความสัมพันธ์โดยนัยระหว่างการดำเนินการจาก ประเภทต่างๆพอร์ตและการทำงานบางอย่างต้องได้รับการสนับสนุนจากบริการทั้งหมด ประเภทที่ต้องการพอร์ต
  1. นี่เป็นการแปลแบบขยายบางส่วนฟรีของเอกสาร Web Services Description Language (WSDL) 1.1 ลงวันที่ 15 มีนาคม 2544
  2. ไม่สะดวกอย่างยิ่งในการใช้งานด้วยคำที่ไม่อาจปฏิเสธได้ซึ่งเขียนเป็นภาษาละตินและยังมีการแปลอย่างไม่คลุมเครืออีกด้วย ดังนั้นชื่อเดิมจะได้รับเมื่อมีการแนะนำคำศัพท์ใหม่เท่านั้นและในข้อความจะใช้การแปลภาษารัสเซียเพิ่มเติม

ในบทที่ 2 เราได้พูดคุยกันว่าหลังจากสร้างบริการเว็บบนเซิร์ฟเวอร์เป็นเซิร์ฟเล็ต, เพจ JSP, ไฟล์ JWS, EJB หรืออ็อบเจ็กต์อื่นๆ คุณควรอธิบายองค์ประกอบและความสามารถของบริการเว็บในภาษาที่ไม่ขึ้นกับแพลตฟอร์ม ระบบปฏิบัติการระบบโปรแกรมที่ใช้ในการสร้างบริการเว็บ คำอธิบายนี้ได้รับการลงทะเบียนในตำแหน่งที่สาธารณชนสามารถเข้าถึงได้บนอินเทอร์เน็ต เช่น รีจิสทรี UDDI หรือ ebXML หรือจัดเก็บไว้ในเซิร์ฟเวอร์บริการเว็บ คำอธิบายจะต้องมีข้อมูลที่ครบถ้วนและถูกต้องเกี่ยวกับบริการทั้งหมดที่ให้บริการโดยบริการบนเว็บ วิธีการรับบริการ เนื้อหาของคำขอบริการ และรูปแบบของข้อมูลที่ให้ไว้

วิธีการหนึ่งในการอธิบายบริการบนเว็บอย่างถูกต้องและสม่ำเสมอคือภาษา WSDL ที่สร้างขึ้นโดยกลุ่ม W3C ภาษานี้เป็นการนำ XML ไปใช้อีกอย่างหนึ่ง ข้อมูลจำเพาะที่แนะนำล่าสุดจะถูกเผยแพร่บนเพจเสมอ http://www.w3.org/TR/wsdI- ในขณะที่เขียนหนังสือ เวอร์ชัน WSDL คือ 1.2 ซึ่งเราจะอธิบายในบทนี้

องค์ประกอบของเอกสาร WSDL

องค์ประกอบรูทของเอกสาร XML - คำอธิบาย WSDL - คือองค์ประกอบ - ในองค์ประกอบนี้ คุณสามารถใช้แอตทริบิวต์ชื่อทางเลือกเพื่อตั้งชื่อให้กับคำอธิบายได้ นอกจากนี้ยังเป็นสถานที่ที่สะดวกในการแนะนำเนมสเปซที่ใช้ในคำอธิบายอีกด้วย

คำจำกัดความของ WSDL ใช้ประโยชน์จากเนมสเปซต่างๆ อย่างกว้างขวาง นอกเหนือจากชื่อที่ถูกต้องแล้ว WSDL มักจะใช้ชื่อประเภทและองค์ประกอบของภาษาคำอธิบาย XSD Schema (ดูบทที่ 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 องค์ประกอบอีกด้วย

? - รวมไฟล์สคีมา WSDL XSD หรือไฟล์ 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 หน้า: ป่วย