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>