ugrás a tartalomhoz

SoapClient hibakeresés

carstepD · 2008. Aug. 26. (K), 11.40
Üdv Mindenkinek,

olyan kérdésem lenne,hogy van egy comlpex type-os Soap Server és Client, mindkettő PHP-ban van megcsinálva, de állandóan hibaüzentet kapok: DTD are not Supported by SOAP-al

Server (wsServer.php):
<?php
    class ctManu {
        /** @var string Identity of the Manufacturer */
        public $id;
        /** @var string Name of the Manufacturer */
        public $name;
        
        public function __construct( $id, $name ) {
            $this->id    = $id;
            $this->name  = $name;
        }
    }

    class wsServer {
        protected $tranid;
        
        public function __construct( ) {
            $this->tranid = $this->loadTransid();
        }
        
        private function loadTransid() {
            if ( !isset($_SESSION) ) {
                session_start();
            }
            
            //return $_SESSION['tranid'];
            return '20C';
        }
        
        /**
         * Get Car manufacturers to fill up combobox
         * @param string $tranid transaction identifier after login
         * @return ctManu[]
         */
        public function getManufacturers( $tranid ) {
            if ( $tranid == $this->tranid ) {
                $out = array(
                    new ctManu('aaa','Opel'),
                    new ctManu('xxx','Porsche')
                );
                
                return $out;
            }
        }
    }
    ini_set("soap.wsdl_cache_enabled", "0"); 
    
    $server = new SoapServer( "http://localhost/wsdlmaker/example/wsServer.php" );
    $server->setClass( "wsServer" );
    $server->handle();
?>
Client (wsclient.php):
<?php

    $client = new SoapClient("http://localhost/wsdlmaker/example/wsServer.wsdl");
    $tranid = '20C';
    //var_dump( $client->__getFunctions() );
    //var_dump( $client->__getTypes() );
    try{
        $res = $client->getManufacturers( $tranid );
    } catch ( SoapFault $SF) {
        var_dump( $SF );
    }
    var_dump($res);?>
wsdl (wsServer.wsdl):
<?xml version="1.0" encoding="UTF-8"?>
<definitions xmlns="http://schemas.xmlsoap.org/wsdl/" name="service1" targetNamespace="http://localhost/WS/login.php?f=wsServer.wsdl" xmlns:tns="http://localhost/WS/login.php?f=wsServer.wsdl" xmlns:impl="http://localhost/WS/login.php?f=wsServer.wsdl" xmlns:xsd1="http://localhost/WS/login.php?f=wsServer.wsdl" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/">
  <types>
    <schema xmlns="http://www.w3.org/2001/XMLSchema" targetNamespace="http://localhost/WS/login.php?f=wsServer.wsdl">
      <complexType name="ArrayOfctManu">
        <complexContent>
          <restriction base="soapenc:Array">
            <attribute ref="soapenc:arrayType" wsdl:arrayType="tns:ctManu[]"/>
          </restriction>
        </complexContent>
      </complexType>
      <complexType name="ctManu">
        <sequence>
          <element name="id" type="xsd:string"/>
          <element name="name" type="xsd:string"/>
        </sequence>
      </complexType>
    </schema>
  </types>
  <portType name="service1PortType">
    <operation name="getManufacturers" parameterOrder="tranid">
      <input message="tns:GetManufacturersRequest"/>
      <output message="tns:GetManufacturersResponse"/>
    </operation>
  </portType>
  <binding name="service1Binding" type="tns:service1PortType">
    <soap:binding style="rpc" transport="http://schemas.xmlsoap.org/soap/http"/>
    <operation name="getManufacturers">
      <soap:operation soapAction="urn:service1#service1Server#getManufacturers"/>
      <input>
        <soap:body parts="tranid" use="encoded" namespace="http://localhost/WS/login.php?f=wsServer.wsdl" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>
      </input>
      <output>
        <soap:body parts="return" use="encoded" namespace="http://localhost/WS/login.php?f=wsServer.wsdl" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>
      </output>
    </operation>
  </binding>
  <message name="GetManufacturersRequest">
    <part name="tranid" type="xsd:string"/>
  </message>
  <message name="GetManufacturersResponse">
    <part name="return" type="tns:ArrayOfctManu"/>
  </message>
  <service name="service1Service">
    <port name="service1Port" binding="tns:service1Binding">
      <soap:address location="http://localhost/wsdlmaker/example/wsServer.php"/>
    </port>
  </service>
</definitions>
Azt hiszem, jelen pillanatban ez így elég jól használható, mindössze, annyi, hogy az egészet a "docroot"/wsdlmaker/example könyvtárba kellene helyezni.

Én már nem látom a fától az erdőt és a hibát sem tudom felderíteni. Egy szóköz változás sincs a tegnap estihez képest.

A kérdés, hogy ha valaki le tudná tesztelni, hogy nála se működik az jó lenne és megköszönném? Tegnap éjjel még működött, de ma reggelre felmondta a szolgálatot. Nem éles rendszer!!!

Üdv
Sanyi
 
1

megloldás

carstepD · 2008. Aug. 26. (K), 13.30
Sziasztok Még1x,

hát hosszú bajlódás után végül is sikerült kiderítenem, hogy a PHP cache-li a wsdl fájlokat és hiába van kikapcsolva a cache-lés 1xűen nem hajlandó frissíteni a wsdl, csak ha manuálisan kitörlöm a cache-ből a wsdl kezdetű fájt.

Mindenesetre sokat segített a __getLastResponse(), __getLastRequestHeaders, __getLastRequest függvények a probléma felderítésében.

Elnézést mindenkitől, aki foglalkozott vele és idejét vettel el.

Üdv
Sanyi