XML Soap
- SOAP ย่อมาจากS imple O bject A access P rotocol
- SOAP เป็นโปรโตคอลการสื่อสารแอปพลิเคชัน
- SOAP เป็นรูปแบบการส่งและรับข้อความ
- SOAP เป็นแพลตฟอร์มที่เป็นอิสระ
- SOAP ขึ้นอยู่กับ XML
- SOAP เป็นคำแนะนำของ W3C
ทำไมต้องสบู่?
เป็นสิ่งสำคัญสำหรับเว็บแอปพลิเคชันเพื่อให้สามารถสื่อสารผ่านอินเทอร์เน็ตได้
วิธีที่ดีที่สุดในการสื่อสารระหว่างแอปพลิเคชันคือผ่าน HTTP เนื่องจากอินเทอร์เน็ตเบราว์เซอร์และเซิร์ฟเวอร์ทั้งหมดรองรับ HTTP SOAP ถูกสร้างขึ้นเพื่อทำสิ่งนี้ให้สำเร็จ
SOAP มีวิธีการสื่อสารระหว่างแอปพลิเคชันที่ทำงานบนระบบปฏิบัติการที่แตกต่างกัน ด้วยเทคโนโลยีและภาษาโปรแกรมที่แตกต่างกัน
บล็อกตัวต่อ SOAP
ข้อความ SOAP เป็นเอกสาร XML ธรรมดาที่มีองค์ประกอบต่อไปนี้:
- องค์ประกอบซองจดหมายที่ระบุเอกสาร XML เป็นข้อความ SOAP
- องค์ประกอบส่วนหัวที่มีข้อมูลส่วนหัว
- องค์ประกอบร่างกายที่มีข้อมูลการโทรและการตอบสนอง
- องค์ประกอบข้อบกพร่องที่มีข้อผิดพลาดและข้อมูลสถานะ
องค์ประกอบทั้งหมดข้างต้นได้รับการประกาศในเนมสเปซเริ่มต้นสำหรับซองจดหมาย SOAP:
http://www.w3.org/2003/05/soap-envelope/
และเนมสเปซเริ่มต้นสำหรับการเข้ารหัส SOAP และประเภทข้อมูลคือ:
http://www.w3.org/2003/05/soap-encoding
กฎไวยากรณ์
ต่อไปนี้คือกฎไวยากรณ์ที่สำคัญบางประการ:
- ข้อความ SOAP ต้องเข้ารหัสโดยใช้ XML
- ข้อความ SOAP ต้องใช้เนมสเปซ SOAP Envelope
- ข้อความ SOAP ต้องไม่มีการอ้างอิง DTD
- ข้อความ SOAP ต้องไม่มีคำแนะนำในการประมวลผล XML
ข้อความ SOAP โครงกระดูก
<?xml version="1.0"?>
<soap:Envelope
xmlns:soap="http://www.w3.org/2003/05/soap-envelope/"
soap:encodingStyle="http://www.w3.org/2003/05/soap-encoding">
<soap:Header>
...
</soap:Header>
<soap:Body>
...
<soap:Fault>
...
</soap:Fault>
</soap:Body>
</soap:Envelope>
องค์ประกอบของซองจดหมายสบู่
องค์ประกอบ SOAP Envelope ที่จำเป็นคือองค์ประกอบรูทของข้อความ SOAP อิลิเมนต์นี้กำหนดเอกสาร XML เป็นข้อความ SOAP
ตัวอย่าง
<?xml version="1.0"?>
<soap:Envelope
xmlns:soap="http://www.w3.org/2003/05/soap-envelope/"
soap:encodingStyle="http://www.w3.org/2003/05/soap-encoding">
...
Message information goes here
...
</soap:Envelope>
xmlns:soap เนมสเปซ
สังเกต xmlns:soap เนมสเปซในตัวอย่างด้านบน ควรมีค่าเป็น: "http://www.w3.org/2003/05/soap-envelope/" เสมอ
เนมสเปซกำหนดซองจดหมายเป็นซอง SOAP
หากใช้เนมสเปซอื่น แอปพลิเคชันจะสร้างข้อผิดพลาดและยกเลิกข้อความ
encodingStyle Attribute
แอตทริบิวต์ encodingStyle ใช้เพื่อกำหนดประเภทข้อมูลที่ใช้ในเอกสาร คุณลักษณะนี้อาจปรากฏบนองค์ประกอบ SOAP ใดๆ และนำไปใช้กับเนื้อหาขององค์ประกอบและองค์ประกอบย่อยทั้งหมด
ข้อความ SOAP ไม่มีการเข้ารหัสเริ่มต้น
ไวยากรณ์
soap:encodingStyle="URI"
ตัวอย่าง
<?xml version="1.0"?>
<soap:Envelope
xmlns:soap="http://www.w3.org/2003/05/soap-envelope/"
soap:encodingStyle="http://www.w3.org/2003/05/soap-encoding">
...
Message information goes here
...
</soap:Envelope>
องค์ประกอบส่วนหัว SOAP
องค์ประกอบส่วนหัว SOAP ที่เป็นตัวเลือกมีข้อมูลเฉพาะแอปพลิเคชัน (เช่น การตรวจสอบสิทธิ์ การชำระเงิน ฯลฯ) เกี่ยวกับข้อความ SOAP
หากมีองค์ประกอบส่วนหัว จะต้องเป็นองค์ประกอบลูกแรกขององค์ประกอบซองจดหมาย
หมายเหตุ:องค์ประกอบลูกในทันทีทั้งหมดขององค์ประกอบส่วนหัวต้องผ่านการรับรองเนมสเปซ
<?xml version="1.0"?>
<soap:Envelope
xmlns:soap="http://www.w3.org/2003/05/soap-envelope/"
soap:encodingStyle="http://www.w3.org/2003/05/soap-encoding">
<soap:Header>
<m:Trans xmlns:m="https://www.w3schools.com/transaction/"
soap:mustUnderstand="1">234
</m:Trans>
</soap:Header>
...
...
</soap:Envelope>
ตัวอย่างข้างต้นมีส่วนหัวที่มีองค์ประกอบ "Trans" แอตทริบิวต์ "mustUnderstand" ที่มีค่า 1 และค่า 234
SOAP กำหนดสามแอตทริบิวต์ในเนมสเปซเริ่มต้น คุณลักษณะเหล่านี้ ได้แก่ mustUnderstand นักแสดง และ encodingStyle
แอตทริบิวต์ที่กำหนดไว้ในส่วนหัว SOAP กำหนดวิธีที่ผู้รับควรประมวลผลข้อความ SOAP
คุณลักษณะที่ต้องเข้าใจ
สามารถใช้แอตทริบิวต์ SOAP mustUnderstand เพื่อระบุว่ารายการส่วนหัวบังคับหรือเป็นทางเลือกสำหรับผู้รับในการประมวลผล
หากคุณเพิ่ม mustUnderstand="1" ให้กับองค์ประกอบลูกขององค์ประกอบส่วนหัว แสดงว่าผู้รับที่ประมวลผลส่วนหัวต้องรู้จักองค์ประกอบนั้น หากผู้รับไม่รู้จักองค์ประกอบ ก็จะล้มเหลวเมื่อประมวลผลส่วนหัว
ไวยากรณ์
soap:mustUnderstand="0|1"
ตัวอย่าง
<?xml version="1.0"?>
<soap:Envelope
xmlns:soap="http://www.w3.org/2003/05/soap-envelope/"
soap:encodingStyle="http://www.w3.org/2003/05/soap-encoding">
<soap:Header>
<m:Trans xmlns:m="https://www.w3schools.com/transaction/"
soap:mustUnderstand="1">234
</m:Trans>
</soap:Header>
...
...
</soap:Envelope>
คุณสมบัตินักแสดง
ข้อความ SOAP อาจเดินทางจากผู้ส่งไปยังผู้รับโดยส่งปลายทางที่แตกต่างกันไปตามเส้นทางข้อความ อย่างไรก็ตาม ไม่ใช่ทุกส่วนของข้อความ SOAP ที่อาจมีไว้สำหรับปลายทางสุดท้าย แต่อาจมีไว้สำหรับจุดปลายอย่างน้อยหนึ่งจุดบนเส้นทางข้อความ
แอตทริบิวต์ตัวแสดง SOAP ใช้เพื่อระบุองค์ประกอบส่วนหัวไปยังปลายทางเฉพาะ
ไวยากรณ์
soap:actor="URI"
ตัวอย่าง
<?xml version="1.0"?>
<soap:Envelope
xmlns:soap="http://www.w3.org/2003/05/soap-envelope/"
soap:encodingStyle="http://www.w3.org/2003/05/soap-encoding">
<soap:Header>
<m:Trans xmlns:m="https://www.w3schools.com/transaction/"
soap:actor="https://www.w3schools.com/code/">234
</m:Trans>
</soap:Header>
...
...
</soap:Envelope>
encodingStyle Attribute
แอตทริบิวต์ encodingStyle ใช้เพื่อกำหนดประเภทข้อมูลที่ใช้ในเอกสาร คุณลักษณะนี้อาจปรากฏในองค์ประกอบ SOAP ใดๆ และจะนำไปใช้กับเนื้อหาขององค์ประกอบนั้นและองค์ประกอบย่อยทั้งหมด
ข้อความ SOAP ไม่มีการเข้ารหัสเริ่มต้น
ไวยากรณ์
soap:encodingStyle="URI"
สบู่องค์ประกอบร่างกาย
องค์ประกอบ SOAP Body ที่จำเป็นมีข้อความ SOAP จริงที่มีไว้สำหรับปลายทางสุดท้ายของข้อความ
องค์ประกอบลูกทันทีขององค์ประกอบ SOAP Body อาจผ่านการรับรองเนมสเปซ
ตัวอย่าง
<?xml version="1.0"?>
<soap:Envelope
xmlns:soap="http://www.w3.org/2003/05/soap-envelope/"
soap:encodingStyle="http://www.w3.org/2003/05/soap-encoding">
<soap:Body>
<m:GetPrice xmlns:m="https://www.w3schools.com/prices">
<m:Item>Apples</m:Item>
</m:GetPrice>
</soap:Body>
</soap:Envelope>
ตัวอย่างข้างต้นขอราคาของแอปเปิ้ล โปรดทราบว่าองค์ประกอบ m:GetPrice และ Item ด้านบนเป็นองค์ประกอบเฉพาะแอปพลิเคชัน สิ่งเหล่านี้ไม่ได้เป็นส่วนหนึ่งของเนมสเปซ SOAP
การตอบสนอง SOAP อาจมีลักษณะดังนี้:
<?xml version="1.0"?>
<soap:Envelope
xmlns:soap="http://www.w3.org/2003/05/soap-envelope/"
soap:encodingStyle="http://www.w3.org/2003/05/soap-encoding">
<soap:Body>
<m:GetPriceResponse xmlns:m="https://www.w3schools.com/prices">
<m:Price>1.90</m:Price>
</m:GetPriceResponse>
</soap:Body>
</soap:Envelope>
SOAP Fault Element
องค์ประกอบ SOAP Fault ที่เป็นตัวเลือกใช้เพื่อระบุข้อความแสดงข้อผิดพลาด
อิลิเมนต์ SOAP Fault เก็บข้อมูลข้อผิดพลาดและสถานะสำหรับข้อความ SOAP
หากมีองค์ประกอบ Fault จะต้องปรากฏเป็นองค์ประกอบย่อยขององค์ประกอบ Body องค์ประกอบ Fault สามารถปรากฏได้เพียงครั้งเดียวในข้อความ SOAP
องค์ประกอบ SOAP Fault มีองค์ประกอบย่อยต่อไปนี้:
Sub Element | Description |
---|---|
<faultcode> | A code for identifying the fault |
<faultstring> | A human readable explanation of the fault |
<faultactor> | Information about who caused the fault to happen |
<detail> |
Holds application specific error information related to the Body element |
รหัสความผิดปกติ SOAP
ต้องใช้ค่ารหัสข้อบกพร่องที่กำหนดไว้ด้านล่างในองค์ประกอบรหัสข้อบกพร่องเมื่ออธิบายข้อบกพร่อง:
Error | Description |
---|---|
VersionMismatch | Found an invalid namespace for the SOAP Envelope element |
MustUnderstand | An immediate child element of the Header element, with the mustUnderstand attribute set to "1", was not understood |
Client | The message was incorrectly formed or contained incorrect information |
Server | There was a problem with the server so the message could not proceed |
โปรโตคอล HTTP
HTTP สื่อสารผ่าน TCP/IP ไคลเอนต์ HTTP เชื่อมต่อกับเซิร์ฟเวอร์ HTTP โดยใช้ TCP หลังจากสร้างการเชื่อมต่อแล้ว ไคลเอนต์สามารถส่งข้อความคำขอ HTTP ไปยังเซิร์ฟเวอร์:
POST /item HTTP/1.1
Host: 189.123.255.239
Content-Type: text/plain
Content-Length: 200
จากนั้นเซิร์ฟเวอร์จะประมวลผลคำขอและส่งการตอบกลับ HTTP กลับไปยังไคลเอ็นต์ การตอบกลับมีรหัสสถานะที่ระบุสถานะของคำขอ:
200 OK
Content-Type: text/plain
Content-Length: 200
ในตัวอย่างข้างต้น เซิร์ฟเวอร์ส่งคืนรหัสสถานะ 200 ซึ่งเป็นรหัสความสำเร็จมาตรฐานสำหรับ HTTP
หากเซิร์ฟเวอร์ไม่สามารถถอดรหัสคำขอได้ เซิร์ฟเวอร์อาจส่งคืนข้อมูลดังนี้:
400 Bad Request
Content-Length: 0
SOAP Binding
ข้อกำหนด SOAP กำหนดโครงสร้างของข้อความ SOAP ไม่ใช่วิธีการแลกเปลี่ยน ช่องว่างนี้เต็มไปด้วยสิ่งที่เรียกว่า "SOAP Bindings" การเชื่อมโยง SOAP เป็นกลไกที่ช่วยให้ข้อความ SOAP สามารถแลกเปลี่ยนได้อย่างมีประสิทธิภาพโดยใช้โปรโตคอลการขนส่ง
การใช้งาน SOAP ส่วนใหญ่จัดให้มีการเชื่อมโยงสำหรับโปรโตคอลการขนส่งทั่วไป เช่น HTTP หรือ SMTP
HTTP เป็นแบบซิงโครนัสและใช้กันอย่างแพร่หลาย คำขอ SOAP HTTP ระบุส่วนหัว HTTP อย่างน้อยสองส่วนหัว: Content-Type และ Content-Length
SMTP เป็นแบบอะซิงโครนัสและใช้ในทางเลือกสุดท้ายหรือบางกรณี
การใช้งาน Java ของ SOAP มักจะจัดให้มีการเชื่อมโยงเฉพาะสำหรับโปรโตคอล JMS (Java Messaging System)
ชนิดของเนื้อหา
ส่วนหัว Content-Type สำหรับคำขอ SOAP และการตอบสนองกำหนดประเภท MIME สำหรับข้อความและการเข้ารหัสอักขระ (ทางเลือก) ที่ใช้สำหรับเนื้อหา XML ของคำขอหรือการตอบกลับ
ไวยากรณ์
Content-Type: MIMEType; charset=character-encoding
ตัวอย่าง
POST /item HTTP/1.1
Content-Type: application/soap+xml; charset=utf-8
เนื้อหา-ความยาว
ส่วนหัวความยาวเนื้อหาสำหรับคำขอ SOAP และการตอบกลับระบุจำนวนไบต์ในเนื้อความของคำขอหรือการตอบกลับ
ไวยากรณ์
Content-Length: bytes
ตัวอย่าง
POST /item HTTP/1.1
Content-Type: application/soap+xml; charset=utf-8
Content-Length: 250
ตัวอย่างสบู่
ในตัวอย่างด้านล่าง คำขอ GetStockPrice จะถูกส่งไปยังเซิร์ฟเวอร์ คำขอมีพารามิเตอร์ StockName และพารามิเตอร์ราคาที่จะถูกส่งกลับในการตอบกลับ เนมสเปซสำหรับฟังก์ชันถูกกำหนดใน "http://www.example.org/stock"
คำขอ SOAP:
POST /InStock HTTP/1.1
Host: www.example.org
Content-Type: application/soap+xml; charset=utf-8
Content-Length: nnn
<?xml version="1.0"?>
<soap:Envelope
xmlns:soap="http://www.w3.org/2003/05/soap-envelope/"
soap:encodingStyle="http://www.w3.org/2003/05/soap-encoding">
<soap:Body xmlns:m="http://www.example.org/stock">
<m:GetStockPrice>
<m:StockName>IBM</m:StockName>
</m:GetStockPrice>
</soap:Body>
</soap:Envelope>
การตอบสนองของ SOAP:
HTTP/1.1 200 OK
Content-Type: application/soap+xml; charset=utf-8
Content-Length: nnn
<?xml version="1.0"?>
<soap:Envelope
xmlns:soap="http://www.w3.org/2003/05/soap-envelope/"
soap:encodingStyle="http://www.w3.org/2003/05/soap-encoding">
<soap:Body xmlns:m="http://www.example.org/stock">
<m:GetStockPriceResponse>
<m:Price>34.5</m:Price>
</m:GetStockPriceResponse>
</soap:Body>
</soap:Envelope>