SunshinePHP 2020

Размещение сервисного компонента как веб-сервиса

SCA может генерировать WSDL из аннотаций сервисного компонента, для его легкого развертывания как веб-сервиса. Для указания SCA, что надо создавать WSDL, необходимо добавить аннотацию @binding.soap под аннотацией @service и указать параметры и возвращаемые значения методов, используя аннотации @param и @return. Эти аннотации будут считываться при создании WSDL, а порядок и типы параметров определяют содержимое раздела WSDL <schema>.

SCA всегда генерирует WSDL обернутый как документ/литерал для компонентов предоставляющим веб-сервис. Обратите внимание, что это не препятствует использованию сторонних веб-служб, с WSDL написанным в другом стиле.

В аннотации @param можно использовать 4 скалярных типа: boolean, integer, float и string. Они просто сопоставляются с типами XML-схемы с тем же именем в WSDL. Пример ниже представляет собой простую реализацию службы StockQuote, которую вызывает компонент ConvertedStockQuote и показывает использование типов string и float.

Пример #1 Сервис StockQuote

<?php

include "SCA/SCA.php";

/**
 * Фуфульная реализация веб-сервиса StockQuote.
 *
 * @service
 * @binding.soap
 *
 */
class StockQuote {

    
/**
     * Получение котировки акции по ее имени.
     *
     * @param string $ticker Имя акции.
     * @return float Биржевая котировка.
     */
    
function getQuote($ticker) {
        return 
80.9;
  }
}
?>

На базе данного сервиса будет создана примерно такая WSDL (хотя, возможно, с местоположением службы, отличным от «localhost»):

Пример #2 Созданная WSDL

<?xml version="1.0" encoding="UTF-8"?>
<definitions xmlns="http://schemas.xmlsoap.org/wsdl/" xsi:type="tDefinitions"
    xmlns:tns2="http://StockQuote" xmlns:tns="http://schemas.xmlsoap.org/wsdl/"
    xmlns:tns3="http://schemas.xmlsoap.org/wsdl/soap/"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" targetNamespace="http://StockQuote">
  <types>
    <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
      targetNamespace="http://StockQuote">
      <xs:element name="getQuote">
        <xs:complexType>
          <xs:sequence>
            <xs:element name="ticker" type="xs:string"/>
          </xs:sequence>
        </xs:complexType>
      </xs:element>
      <xs:element name="getQuoteResponse">
        <xs:complexType>
          <xs:sequence>
            <xs:element name="getQuoteReturn" type="xs:float"/>
          </xs:sequence>
        </xs:complexType>
      </xs:element>
    </xs:schema>
  </types>

  <message name="getQuoteRequest">
    <part name="getQuoteRequest" element="tns2:getQuote"/>
  </message>
  <message name="getQuoteResponse">
    <part name="return" element="tns2:getQuoteResponse"/>
  </message>
  <portType name="StockQuotePortType">
    <operation name="getQuote">
      <input message="tns2:getQuoteRequest"/>
      <output message="tns2:getQuoteResponse"/>
    </operation>
  </portType>
  <binding name="StockQuoteBinding" type="tns2:StockQuotePortType">
    <operation name="getQuote">
      <input>
        <tns3:body xsi:type="tBody" use="literal"/>
      </input>
      <output>
        <tns3:body xsi:type="tBody" use="literal"/>
      </output>
      <tns3:operation xsi:type="tOperation" soapAction=""/>
    </operation>
    <tns3:binding xsi:type="tBinding" transport="http://schemas.xmlsoap.org/soap/http" style="document"/>
  </binding>
  <service name="StockQuoteService">
    <port name="StockQuotePort" binding="tns2:StockQuoteBinding">
      <tns3:address xsi:type="tAddress" location="http://localhost/StockQuote/StockQuote.php"/>
    </port>
  </service>
</definitions>

<!-- this line identifies this file as WSDL generated by SCA for PHP. Do not remove -->

add a note add a note

User Contributed Notes 1 note

up
2
deadguysfrom at gmail dot com
10 years ago
In order for SCA to find the service class, the script filename must match the service class name.  In this case, StockQuote.php
To Top