用 PHP 實作 Web Service-一次搞懂 XML、SOAP、WSDL (上)

by Benmr

前言

最近真的串太多 XML 的 api 了
覺得太多眉眉角角要注意 又有滿多詭異的部份
所以這邊記下來 供有需要的朋友參考參考!

名詞解釋

Web Services (Web 服務)

是一種跨程式語言和跨作業系統平臺的遠端呼叫技術

- 跨程式語言
    - 也就是 server 端無論用什麼程式語言寫的, client 端都可以用其他語言寫
- 跨操作平臺:
    - server 端程式和 client 端程式可以在不同的作業系統上執行
- 遠端呼叫技術: 
    - 機器 A 上的一個程式可以呼叫到另外機器 B 上的一個物件的方法
    - 例: Youtube 把斗內的金額狀態以 Web Service 的方式暴露在外,讓 client 端可以呼叫並應用
         比如說做一個斗內的進度條出來 (https://www.youtube.com/watch?v=xdySMoDZq-E)

三大平台技術

- XML XSD
- SOAP
- WSDL

分成以下三個部份詳述

XML XSD

Web Service採用HTTP協議傳輸資料 並採用XML格式封裝資料
(即XML中說明呼叫遠端服務物件的哪個方法,傳遞的引數是什麼,以及服務物件的返回結果是什麼)

XML (Extensible Markup Language,可延伸標記式語言)

- Web Service平臺中表示資料的格式。易於建立和易於分析
- 例:

example.xml

<?xml version="1.0"?>
<note>
<to>George</to>
<from>MoroseDog</from>
<heading>Reminder</heading>
<body>Don't forget the meeting!</body>
</note>

XSD (XML Schema Definition)

- 指出如何形式描述XML文件的元素,定義了一套標準的資料型別,並給出了一種語言來擴充套件這套資料型別
- 例:

example.xsd (XML Schema文件,它定義了上面那個XML文件的元素。)

<?xml version="1.0"?>
<xs:schema xmlns:xs="http://morosedog.gitlab.io/2020/XMLSchema"
targetNamespace="http://morosedog.gitlab.io"
xmlns="http://morosedog.gitlab.io"
elementFormDefault="qualified">

<xs:element name="note">
    <xs:complexType>
      <xs:sequence>
    <xs:element name="to" type="xs:string"/>
    <xs:element name="from" type="xs:string"/>
    <xs:element name="heading" type="xs:string"/>
    <xs:element name="body" type="xs:string"/>
      </xs:sequence>
    </xs:complexType>
</xs:element>

</xs:schema>

註: 工具可能已經自動完成了這個轉換,但我們或會根據需求修改一下轉換過程

SOAP

Web Service通過 HTTP 協議傳送請求和接收結果時
傳送的請求內容和結果內容都採用XML格式封裝
並增加了一些特定的HTTP header
以說明 HTTP 訊息的內容格式
這些特定的 HTTP header 和 XML 內容格式就是 SOAP 協議

SOAP協議 = HTTP協議 + XML資料格式

例:

<?xml version="1.0"?>
<soap:Envelope
xmlns:soap="http://morosedog.gitlab.io/2001/12/soap-envelope"
soap:encodingStyle="http://morosedog.gitlab.io/2001/12/soap-encoding">

<soap:Header>
  ...
  ...
</soap:Header>

<soap:Body>
  ...
  ...
  <soap:Fault>
    ...
    ...
  </soap:Fault>
</soap:Body>

</soap:Envelope>

WSDL (Web Services Description Language)

Web Service 的 client 端要向 server 端呼叫一個Web Service服務時
首先要有知道這個服務的地址在哪 以及這個服務裡有什麼方法可以呼叫
所以Web Service servier端首先要通過一個 WSDL 檔案來說明上述資訊

WSDL 就是這樣一個基於XML的語言
它是Web Service客戶端和伺服器端都能理解的標準格式
用於描述Web Service及其函式、引數和返回值

例:

<message name="getTermRequest">
  <part name="term" type="xs:string"/>
</message>

<message name="getTermResponse">
  <part name="value" type="xs:string"/>
</message>

<portType name="glossaryTerms">
  <operation name="getTerm">
    <input message="getTermRequest"/>
    <output message="getTermResponse"/>
  </operation>
</portType>

寫到這邊 架構大概會長成這樣
(可先忽略 UDDI 的部份)

You may also like

Leave a Comment