Разбор массива в качестве входных данных для php мыла сервера - PullRequest
0 голосов
/ 08 января 2012

Я попал в дыру в PHP, из которой я, похоже, не могу выйти из Google. У меня есть PHP-сервер, где одна функция принимает массив int в качестве входных данных. Как правильно разобрать?

Когда вводом является одно целое, оно работает. Когда это массив, он анализирует строку 'Array'.

Сервер запущен на моем Synology NAS. Я пытался найти какой-то журнал PHP, где мыльный сервер мог бы кричать о своих потенциальных проблемах синтаксического анализа, но я не нашел такого журнала.

Это мой упрощенный сервер:

<?php
if(!extension_loaded("soap")){
 dl("php_soap.dll");
}

ini_set("soap.wsdl_cache_enabled","0");
$server = new SoapServer("input_array_debug.wsdl");

function createProduct($content_refs){
    $debugVar = "outside";

foreach ($content_refs as $reference) {
            $debugVar = "inside";
    error_log("Item:'".$reference."'\n ", 3, "/var/tmp/my-errors.log");
            $debugVar = "after";
}   
return $debugVar;
}

$server->AddFunction("createProduct");
$server->handle();

Это мой WSDL:

    <?xml version="1.0"?>
<definitions 
name="FoodContent" 
targetNamespace="urn:FoodContent" 
xmlns:tns="urn:FoodContent"  
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" 
xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" 
xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" 
xmlns="http://schemas.xmlsoap.org/wsdl/">
  <types>
    <xsd:schema xmlns="http://www.w3.org/2001/XMLSchema" targetNamespace="urn:FoodContent">
      <xsd:complexType name="ArrayOfInt">
        <xsd:sequence>
          <xsd:element minOccurs="1" maxOccurs="unbounded" name="reference" type="xsd:int" />
        </xsd:sequence>
      </xsd:complexType>          
    </xsd:schema>   
  </types>

  <message name="createProduct">
    <part name="content_refs" type="tns:ArrayOfInt" />
  </message> 
  <message name="createProductResponse">
    <part name="reference" type="xsd:string" />
  </message>   

  <portType name="FoodContentPort">
    <operation name="createProduct">
      <input message="tns:createProduct" />
      <output message="tns:createProductResponse" />
    </operation>
  </portType>

  <binding name="FoodContentBinding" type="tns:FoodContentPort">
    <soap:binding style="rpc" transport="http://schemas.xmlsoap.org/soap/http" />
      <operation name="createProduct">
        <soap:operation soapAction="urn:FoodContentAction" />
        <input>
          <soap:body use="encoded" namespace="urn:FoodContent" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" />       
        </input>
        <output>
          <soap:body use="encoded" namespace="urn:FoodContent" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" />       
        </output>
      </operation>        
  </binding>

  <service name="FoodContentService">
    <port name="FoodContentPort" binding="tns:FoodContentBinding">
      <soap:address location="http://other.eu:8888/FoodContents/Debug_server.php" />
    </port>
  </service>          
</definitions>

База запроса мыла генерируется и отправляется из soapUI 4.0.1:

    <soapenv:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:urn="urn:FoodContent">
   <soapenv:Header/>
   <soapenv:Body>
      <urn:createProduct soapenv:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
         <content_refs xsi:type="urn:ArrayOfInt">
            <!--1 or more repetitions:-->
            <reference xsi:type="xsd:int">3</reference>
            <reference xsi:type="xsd:int">7</reference>
         </content_refs>
      </urn:createProduct>
   </soapenv:Body>
</soapenv:Envelope>

Ответ выглядит хорошо

...