Подробное объяснение SOAP и WSDL

PHP

SOAP — это очень распространенный протокол в наших веб-службах. SOAP определяет протокол для реализации вызовов передачи на разных языках и между машинами через XML. WSDL больше похож на спецификацию и документ для предоставляемой услуги. , Их правила и логика, лучше понять протокол SOAP и файл описания WSDL.

Простой протокол доступа к объектам SOAP

SOAP (простой протокол доступа к объектам) Простой протокол доступа к объектамЭто спецификация для обмена данными в веб-службе, обмена структурной информацией. Его можно передавать в формате XML на основе таких протоколов, как HTTP, абстрагируясь от языковой реализации, платформы и оборудования. То есть могут поддерживаться несколько языков, включая PHP, Java и .Net.

Преимущество состоит в том, что он является кросс-языковым, очень подходящим для асинхронной связи и C/S для слабой связи, а недостатком является то, что необходимо выполнять множество проверок во время выполнения.

Связанные концепции

  • Обертка SOAP (конверт), определяет структуру, которая описывает, что содержится в сообщении, кто его отправил и кто должен его принять и обработать.
  • Правила кодирования SOAP (правила кодирования), определяет механизм сериализации, представляющий экземпляр типа данных, который необходимо использовать приложению.
  • Представление SOAP RPC (представление RPC), который определяет контракт для представления удаленных вызовов процедур и ответов.
  • Мыльная связывание, который определяет, какой протокол SOAP использует для обмена информацией. Вы можете использовать протоколы HTTP/TCP/UDP.

Базовая структура

Пример:

<?xml version="1.0"?>
<soap:Envelope
    xmlns:soap="http://www.w3.org/2001/12/soap-envelope"
    soap:encodingStyle="http://www.w3.org/2001/12/soap-encoding">
 
    <soap:Header>
      ...
      ...
    </soap:Header>
 
    <soap:Body>
          ...
          ...
          <soap:Fault>
            ...
            ...
          </soap:Fault>
    </soap:Body>
</soap:Envelope>
 

Сообщение SOAP представляет собой обычный XML-документ, в котором должны существовать элементы Envelope и Body (содержащие информацию о вызове и ответе), элемент Header (содержащий информацию заголовка) и элемент Fault (предоставляющий информацию об ошибке, возникшей при обработке). это сообщение) может существовать как необязательный

Элемент конверта SOAP

Корневой элемент сообщения SOAP, который может определять XML-документ как сообщение SOAP.

Пространства имен

xmlns: исправлено пространство имен SOAP.

SOAP определяет 3 свойства в пространстве имен по умолчанию: актор, mustUnderstand, encodingStyle. Эти атрибуты, определенные в заголовке SOAP, определяют, как контейнер обрабатывает сообщение SOAP.

  • Атрибут mustUnderstand — используется для определения того, является ли элемент заголовка обязательным или необязательным для его обработки получателем. (0 опционально 1 обязательно)soap:mustUnderstand="0/1"
  • Атрибут актера SOAP можно использовать для адресации элементов заголовка к определенной конечной точке.soap:actor="URI"
  • Свойство кодированияStyle SOAP используется для определения типа данных, используемого в документе. Этот атрибут может появиться в любом элементе SOAP и будет применяться к содержимому элемента и ко всем дочерним элементам элемента. Кодировки по умолчанию для сообщений SOAP не существует.soap:encodingstyle="URI"

Элемент заголовка SOAP

Необязательный элемент заголовка SOAP может содержать специфичную для приложения информацию о сообщении SOAP. Если указан элемент Header, он должен быть первым дочерним элементом элемента Envelope.

<soap:Header>
   <m:Trans xmlns:m="http://www.w3schools.com/transaction/"
    soap:mustUnderstand="1">234 #表示处理此头部的接受者必须认可此元素,假如此元素接受者无法认可此元素,则在处理此头部时必须失效
   </m:Trans>
</soap:Heaser>
 

Элемент тела SOAP

Требуемый элемент SOAP Body может содержать фактическое сообщение SOAP, предназначенное для доставки в конечную точку сообщения. Прямые дочерние элементы элемента SOAP Body могут определять пространство имен.

Элемент ошибки SOAP

Используется для хранения сообщений об ошибках и состояниях для сообщений SOAP, необязательный элемент SOAP Fault используется для указания сообщений об ошибках. Если предоставлен элемент Fault, он должен быть дочерним по отношению к элементу Body, а элемент Fault может появляться в сообщении SOAP только один раз.

Подэлемент сбоя SOAP:

  • Код для определения препятствий
  • Удобочитаемое описание расстройства
  • Информация о том, кто стал причиной сбоя
  • Сохранять сообщения об ошибках приложения, связанные с элементом Body

Описание значения кода неисправности:

  • Недопустимое пространство имен для версииMismatch SOAP Envelope найдено
  • Прямой дочерний элемент элемента заголовка mustUnderstand (mustUnderstand="1') не может быть понят
  • Сообщение клиента составлено неправильно или содержит неверную информацию
  • Проблема с сервером сервера, поэтому процесс не может быть продолжен

Язык описания сетевых служб WSDL

WSDL (язык описания веб-служб) Язык описания веб-служб, WSDL — это документ, написанный на языке XML. Такой документ описывает веб-сервис.

Базовая структура

<definitions>
    <types>
       definition of types........
    </types>
    <message>
       definition of a message....
    </message>
    <portType>
       definition of a port.......
    </portType>
    <binding>
       definition of a binding....
    </binding>
</definitions>
 

Документ WSDL обычно содержит 7 важных элементов, а именно: тип, импорт, сообщение, тип порта, операция, привязка, элемент службы. Эти элементы вложены в элемент определения, который является корневым элементом документа WSDL.

Анатомия конкретного экземпляра

Возьмите интерфейс Shengpay в качестве примера, чтобы представить весь файл описания wsdl, URL-адрес выглядит следующим образом: http://cardpay.shengpay.com/api-acquire-channel/services/receiveOrderService?wsdl

Types

Контейнер для определений типов данных, которые используют некоторую систему типов (обычно систему типов в схеме XML).

<xs:element name="receB2COrderRequest" type="tns:ReceB2COrderRequest"/>  
<xs:element name="receB2COrderResponse" type="tns:ReceB2COrderResponse"/>
 
<xs:complexType name="ReceB2COrderRequest"> 
    <xs:sequence> 
      <xs:element minOccurs="0" name="buyerContact" type="xs:string"/>  
      .......
    </xs:sequence> 
</xs:complexType>  
 
<xs:complexType name="receiveB2COrder"> 
        <xs:sequence> 
          <xs:element minOccurs="0" name="arg0" type="tns:ReceB2COrderRequest"/> 
        </xs:sequence> 
</xs:complexType>  
 

Message

Абстрактное типизированное определение структуры данных коммуникационного сообщения. Используйте типы, определенные Types, чтобы определить структуру данных всего сообщения.

<wsdl:message name="receiveB2COrder"> 
    <wsdl:part element="tns:receiveB2COrder" name="parameters"/> 
  </wsdl:message> 
 

Operation & PortType

Операция — это абстрактное описание операций, поддерживаемых службой.Как правило, одна операция описывает пару сообщений запрос/ответ для записи доступа.
PortType Абстрактная коллекция операций, поддерживаемая типом точки входа доступа, которая может поддерживаться одной или несколькими точками доступа службы.

<wsdl:portType name="ReceiveOrderAPI"> 
    <wsdl:operation name="receiveB2COrder"> 
      <wsdl:input message="tns:receiveB2COrder" name="receiveB2COrder"/>  
      <wsdl:output message="tns:receiveB2COrderResponse" name="receiveB2COrderResponse"/>  
      <wsdl:fault message="tns:MasAPIException" name="MasAPIException"/> 
    </wsdl:operation> 
  </wsdl:portType>  
 

Binding

Привязки конкретных протоколов и спецификаций формата данных для конкретных типов портов.

<wsdl:binding name="ReceiveOrderAPIExplorterServiceSoapBinding" type="tns:ReceiveOrderAPI"> 
    <soap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/>  
    <wsdl:operation name="receiveB2COrder"> 
      <soap:operation soapAction="" style="document"/>  
      <wsdl:input name="receiveB2COrder"> 
        <soap:body use="literal"/> 
      </wsdl:input>  
      <wsdl:output name="receiveB2COrderResponse"> 
        <soap:body use="literal"/> 
      </wsdl:output>  
      <wsdl:fault name="MasAPIException"> 
        <soap:fault name="MasAPIException" use="literal"/> 
      </wsdl:fault> 
    </wsdl:operation> 
  </wsdl:binding>  
 

Port&Service

Порт определяется как единая точка доступа к службе в сочетании с привязкой протокола/формата данных и конкретным адресом веб-доступа.
Сервис Набор связанных точек доступа к сервису.

<wsdl:service name="ReceiveOrderAPIExplorterService"> 
    <wsdl:port binding="tns:ReceiveOrderAPIExplorterServiceSoapBinding" name="ReceiveOrderAPIExplorterPort"> 
      <soap:address location="http://cardpay.shengpay.com/api-acquire-channel/services/receiveOrderService"/> 
    </wsdl:port> 
  </wsdl:service> 
 

Пример кода операции PHP

//soap版本为1.1,不缓存wsdl文件
$options = array(
    'trace'=>true,
    'cache_wsdl'=>WSDL_CACHE_NONE,
    'soap_version'=> SOAP_1_1
);
//上送参数
$request = array();//do something
 
//准备请求
$soapClient = new SoapClient($url, $options);
try {
    $response = $soapClient->__soapCall($function, array(array('arg0'=>$request)));
    if (is_object($response)) {
        $responseArray = get_object_vars($response);
        return $responseArray;
    }
} catch (SOAPFault $e) {
    //do something
} catch(Exception $e) {
    //do something
}
 

резюме

Полный текст примера wsdl прилагается:

<?xml version="1.0" encoding="utf-8"?>
 
<wsdl:definitions xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:ns1="http://schemas.xmlsoap.org/soap/http" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:tns="http://www.sdo.com/mas/api/receive/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" name="ReceiveOrderAPIExplorterService" targetNamespace="http://www.sdo.com/mas/api/receive/">  
  <wsdl:types> 
    <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" attributeFormDefault="unqualified" elementFormDefault="unqualified" targetNamespace="http://www.sdo.com/mas/api/receive/">  
      <xs:element name="receB2COrderRequest" type="tns:ReceB2COrderRequest"/>  
      <xs:element name="receB2COrderResponse" type="tns:ReceB2COrderResponse"/>  
      <xs:complexType name="ReceB2COrderRequest"> 
        <xs:sequence> 
          <xs:element minOccurs="0" name="buyerContact" type="xs:string"/>  
          <xs:element minOccurs="0" name="buyerId" type="xs:string"/>  
          <xs:element minOccurs="0" name="buyerIp" type="xs:string"/>  
          <xs:element minOccurs="0" name="buyerName" type="xs:string"/>  
          <xs:element minOccurs="0" name="cardPayInfo" type="xs:string"/>  
          <xs:element minOccurs="0" name="cardValue" type="xs:string"/>  
          <xs:element minOccurs="0" name="currency" type="xs:string"/>  
          <xs:element minOccurs="0" name="depositId" type="xs:string"/>  
          <xs:element minOccurs="0" name="depositIdType" type="xs:string"/>  
          <xs:element minOccurs="0" name="expireTime" type="xs:string"/>  
          <xs:element minOccurs="0" name="extension" type="tns:extension"/>  
          <xs:element minOccurs="0" name="header" type="tns:header"/>  
          <xs:element minOccurs="0" name="instCode" type="xs:string"/>  
          <xs:element minOccurs="0" name="language" type="xs:string"/>  
          <xs:element minOccurs="0" name="notifyUrl" type="xs:string"/>  
          <xs:element minOccurs="0" name="orderAmount" type="xs:string"/>  
          <xs:element minOccurs="0" name="orderNo" type="xs:string"/>  
          <xs:element minOccurs="0" name="orderTime" type="xs:string"/>  
          <xs:element minOccurs="0" name="pageUrl" type="xs:string"/>  
          <xs:element minOccurs="0" name="payChannel" type="xs:string"/>  
          <xs:element minOccurs="0" name="payType" type="xs:string"/>  
          <xs:element minOccurs="0" name="payeeId" type="xs:string"/>  
          <xs:element minOccurs="0" name="payerAuthTicket" type="xs:string"/>  
          <xs:element minOccurs="0" name="payerId" type="xs:string"/>  
          <xs:element minOccurs="0" name="payerMobileNo" type="xs:string"/>  
          <xs:element minOccurs="0" name="productDesc" type="xs:string"/>  
          <xs:element minOccurs="0" name="productId" type="xs:string"/>  
          <xs:element minOccurs="0" name="productName" type="xs:string"/>  
          <xs:element minOccurs="0" name="productNum" type="xs:string"/>  
          <xs:element minOccurs="0" name="productUrl" type="xs:string"/>  
          <xs:element minOccurs="0" name="sellerId" type="xs:string"/>  
          <xs:element minOccurs="0" name="signature" type="tns:signature"/>  
          <xs:element minOccurs="0" name="terminalType" type="xs:string"/>  
          <xs:element minOccurs="0" name="unitPrice" type="xs:string"/> 
        </xs:sequence> 
      </xs:complexType>  
      <xs:complexType name="extension"> 
        <xs:sequence> 
          <xs:element minOccurs="0" name="ext1" type="xs:string"/>  
          <xs:element minOccurs="0" name="ext2" type="xs:string"/>  
          <xs:element minOccurs="0" name="ext3" type="xs:string"/> 
        </xs:sequence> 
      </xs:complexType>  
      <xs:complexType name="header"> 
        <xs:sequence> 
          <xs:element minOccurs="0" name="charset" type="xs:string"/>  
          <xs:element minOccurs="0" name="sendTime" type="xs:string"/>  
          <xs:element minOccurs="0" name="sender" type="tns:sender"/>  
          <xs:element minOccurs="0" name="service" type="tns:service"/>  
          <xs:element minOccurs="0" name="traceNo" type="xs:string"/> 
        </xs:sequence> 
      </xs:complexType>  
      <xs:complexType name="sender"> 
        <xs:sequence> 
          <xs:element minOccurs="0" name="senderId" type="xs:string"/> 
        </xs:sequence> 
      </xs:complexType>  
      <xs:complexType name="service"> 
        <xs:sequence> 
          <xs:element minOccurs="0" name="serviceCode" type="xs:string"/>  
          <xs:element minOccurs="0" name="version" type="xs:string"/> 
        </xs:sequence> 
      </xs:complexType>  
      <xs:complexType name="signature"> 
        <xs:sequence> 
          <xs:element minOccurs="0" name="signMsg" type="xs:string"/>  
          <xs:element minOccurs="0" name="signType" type="xs:string"/> 
        </xs:sequence> 
      </xs:complexType>  
      <xs:complexType name="ReceB2COrderResponse"> 
        <xs:sequence> 
          <xs:element minOccurs="0" name="customerLogoUrl" type="xs:string"/>  
          <xs:element minOccurs="0" name="customerName" type="xs:string"/>  
          <xs:element minOccurs="0" name="customerNo" type="xs:string"/>  
          <xs:element minOccurs="0" name="extension" type="tns:extension"/>  
          <xs:element minOccurs="0" name="header" type="tns:header"/>  
          <xs:element minOccurs="0" name="orderAmount" type="xs:string"/>  
          <xs:element minOccurs="0" name="orderNo" type="xs:string"/>  
          <xs:element minOccurs="0" name="orderType" type="xs:string"/>  
          <xs:element minOccurs="0" name="returnInfo" type="tns:returnInfo"/>  
          <xs:element minOccurs="0" name="sessionId" type="xs:string"/>  
          <xs:element minOccurs="0" name="signature" type="tns:signature"/>  
          <xs:element minOccurs="0" name="tokenId" type="xs:string"/>  
          <xs:element minOccurs="0" name="transNo" type="xs:string"/>  
          <xs:element minOccurs="0" name="transStatus" type="xs:string"/>  
          <xs:element minOccurs="0" name="transTime" type="xs:string"/> 
        </xs:sequence> 
      </xs:complexType>  
      <xs:complexType name="returnInfo"> 
        <xs:sequence> 
          <xs:element minOccurs="0" name="errorCode" type="xs:string"/>  
          <xs:element minOccurs="0" name="errorMsg" type="xs:string"/> 
        </xs:sequence> 
      </xs:complexType>  
      <xs:element name="MasAPIException" type="tns:MasAPIException"/>  
      <xs:complexType name="MasAPIException"> 
        <xs:sequence/> 
      </xs:complexType>  
      <xs:element name="receiveB2COrder" type="tns:receiveB2COrder"/>  
      <xs:complexType name="receiveB2COrder"> 
        <xs:sequence> 
          <xs:element minOccurs="0" name="arg0" type="tns:ReceB2COrderRequest"/> 
        </xs:sequence> 
      </xs:complexType>  
      <xs:element name="receiveB2COrderResponse" type="tns:receiveB2COrderResponse"/>  
      <xs:complexType name="receiveB2COrderResponse"> 
        <xs:sequence> 
          <xs:element minOccurs="0" name="return" type="tns:ReceB2COrderResponse"/> 
        </xs:sequence> 
      </xs:complexType> 
    </xs:schema> 
  </wsdl:types>  
  <wsdl:message name="receiveB2COrder"> 
    <wsdl:part element="tns:receiveB2COrder" name="parameters"/> 
  </wsdl:message>  
  <wsdl:message name="receiveB2COrderResponse"> 
    <wsdl:part element="tns:receiveB2COrderResponse" name="parameters"/> 
  </wsdl:message>  
  <wsdl:message name="MasAPIException"> 
    <wsdl:part element="tns:MasAPIException" name="MasAPIException"/> 
  </wsdl:message>  
  <wsdl:portType name="ReceiveOrderAPI"> 
    <wsdl:operation name="receiveB2COrder"> 
      <wsdl:input message="tns:receiveB2COrder" name="receiveB2COrder"/>  
      <wsdl:output message="tns:receiveB2COrderResponse" name="receiveB2COrderResponse"/>  
      <wsdl:fault message="tns:MasAPIException" name="MasAPIException"/> 
    </wsdl:operation> 
  </wsdl:portType>  
  <wsdl:binding name="ReceiveOrderAPIExplorterServiceSoapBinding" type="tns:ReceiveOrderAPI"> 
    <soap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/>  
    <wsdl:operation name="receiveB2COrder"> 
      <soap:operation soapAction="" style="document"/>  
      <wsdl:input name="receiveB2COrder"> 
        <soap:body use="literal"/> 
      </wsdl:input>  
      <wsdl:output name="receiveB2COrderResponse"> 
        <soap:body use="literal"/> 
      </wsdl:output>  
      <wsdl:fault name="MasAPIException"> 
        <soap:fault name="MasAPIException" use="literal"/> 
      </wsdl:fault> 
    </wsdl:operation> 
  </wsdl:binding>  
  <wsdl:service name="ReceiveOrderAPIExplorterService"> 
    <wsdl:port binding="tns:ReceiveOrderAPIExplorterServiceSoapBinding" name="ReceiveOrderAPIExplorterPort"> 
      <soap:address location="http://cardpay.shengpay.com/api-acquire-channel/services/receiveOrderService"/> 
    </wsdl:port> 
  </wsdl:service> 
</wsdl:definitions>
 
 

Статьи по Теме