[PHP] SOAP fault procedure "" not present

Pagina: 1
Acties:
  • 626 views sinds 30-01-2008
  • Reageer

Onderwerpen


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Ik probeer al een aantal dagen een webservice in PHP aan de praat te krijgen, tot op heden niet helemaal succesvol. Voor het gemak heb ik een eenvoudige versie gemaakt:

Ik heb de volgende wsdl:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
<?xml version="1.0" encoding="UTF-8"?>
<definitions targetNamespace="test"
             xmlns="http://schemas.xmlsoap.org/wsdl/"
             xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
             xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
             xmlns:xsd="http://www.w3.org/2001/XMLSchema"
             xmlns:tns="test" name="test">
    <types>
        <xsd:schema targetNamespace="test" xmlns:tns="test">
            <xsd:element name="text1" type="xsd:string"></xsd:element>
            <xsd:element name="text2" type="xsd:string"></xsd:element>
        </xsd:schema>
    </types>
    <message name="Request">
        <part name="header" element="tns:text1"/>
        <part name="body" element="tns:text2"/>
    </message>
    <message name="Response">
        <part name="header" element="tns:text1"/>
        <part name="body" element="tns:text2"/>
    </message>
    <message name="Fault">
        <part name="body" element="tns:text1"/>
    </message>
    <portType name="ServicePortType">
        <operation name="operation">
            <input message="tns:Request"/>
            <output message="tns:Response"/>
            <fault name="foutmelding" message="tns:Fault"/>
        </operation>
    </portType>
    <binding name="SoapBinding" type="tns:ServicePortType">
        <soap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/>
        <operation name="operation">
            <soap:operation/>
            <input>
                <soap:body use="literal"/>
            </input>
            <output>
                <soap:body use="literal"/>
            </output>
            <fault name="foutmelding"/>
        </operation>
    </binding>
    <service name="Service">
        <port name="ServiceSoapPort" binding="tns:SoapBinding">
            <soap:address location="http://localhost/VoI/testserver.php"/>
        </port>
    </service>
</definitions>


deze WSDL valideert prima.

Vervolgens heb ik de volgende testserver.php opgezet:

code:
1
2
3
4
5
6
7
8
9
10
11
<?php
$server = new SoapServer("webservice/wsdl/test.wsdl");
$server->setClass("testClass");
$server->handle();

class testClass {
    function operation($input) { 
        return array ("text1", "text2");
    }
}
?>


Als ik deze webservice aanroep krijg ik de volgende foutmelding:

code:
1
2
3
4
5
6
7
8
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
   <SOAP-ENV:Body>
      <SOAP-ENV:Fault>
         <faultcode>SOAP-ENV:Server</faultcode>
         <faultstring>Procedure 'text1' not present</faultstring>
      </SOAP-ENV:Fault>
   </SOAP-ENV:Body>
</SOAP-ENV:Envelope>


Het bijbehorende request bericht ziet er als volgt uit:

code:
1
2
3
4
5
6
7
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:test="test">
   <soapenv:Header/>
   <soapenv:Body>
      <test:text1>?</test:text1>
      <test:text2>?</test:text2>
   </soapenv:Body>
</soapenv:Envelope>


Wanneer ik de wsdl aanpas zodat het request bericht één part element bevat krijg ik wel een goed resultaat. De aanroep is dan als volgt:

code:
1
2
3
4
5
6
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:test="test">
   <soapenv:Header/>
   <soapenv:Body>
      <test:text2>?</test:text2>
   </soapenv:Body>
</soapenv:Envelope>


Met als resultaat:

code:
1
2
3
4
5
6
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns1="test">
   <SOAP-ENV:Body>
      <ns1:text1>text1</ns1:text1>
      <ns1:text2>text2</ns1:text2>
   </SOAP-ENV:Body>
</SOAP-ENV:Envelope>


Het zit hem dus duidelijk in de verwerking van het request bericht. Ik heb zelf al uitvoerig gezocht op Internet, maar zoeken op soap procedure not present resulteert steeds in één issue die op talloze bulletin boards terugkomt en is opgelost door een restart. Dat mocht voor mij niet baten. Ook lees ik over een foutmelding als een function wordt aangeroepen zonder input parameters. Dat is volgens mij ook niet het geval.

Ik heb al geprobeerd om de functions text1 en text2 op te nemen. Dit mocht helaas niet baten.

Ik hoop dat iemand mij kan helpen. Ik zit inmiddels redelijk met mijn handen in het haar :)

Acties:
  • 0 Henk 'm!

  • Japius
  • Registratie: April 2003
  • Laatst online: 30-08 20:57
Het kan zijn dat ik er overheen kijk, maar ik zie je geen argumenten meegeven aan je request.
setClass is aanwezig, maar krijgt geen $input mee.

Ik gebruik zelf overigens meestal nusoap, omdat ik dan niet afhankelijk ben van meegebakken modules in php.

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Hm,

ik heb daar even naar gekeken, maar met simpele dummy input (twee variabelen, een array) krijg ik dezelfde melding.

Iemand nog suggesties?

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Ik heb nusoap geprobeerd, maar dat schoot in mijn geval zo snel niet op. Had al erg veel moeite om een simpel xml schema door nusoap te laten importeren.

Ik hou het even op de php implementatie van SOAP.

Iemand nog een suggestie voor mij?

Acties:
  • 0 Henk 'm!

  • Japius
  • Registratie: April 2003
  • Laatst online: 30-08 20:57
ben je al wat verder?

Acties:
  • +1 Henk 'm!

  • den 150
  • Registratie: Oktober 2002
  • Niet online
Het is bij mij ondertussen een tijdje geleden dat ik nog SOAP heb gedaan maar ik ga toch een poging wagen.

Je hebt een document/literal wsdl. Proficiat! Zo hoort het :). Je hebt echter 2 message parts in zowel Request als Response message
XML:
1
2
3
4
<message name="Request">
  <part name="header" element="tns:text1"/>
  <part name="body" element="tns:text2"/>
</message>


Bij document/literal style mag je maar 1 message part hebben. Je wsdl wordt dan zoiets
XML:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
<?xml version="1.0" encoding="UTF-8"?>
<definitions targetNamespace="test"
             xmlns="http://schemas.xmlsoap.org/wsdl/"
             xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
             xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
             xmlns:xsd="http://www.w3.org/2001/XMLSchema"
             xmlns:tns="test" name="test">
    <types>
        <xsd:schema targetNamespace="test" xmlns:tns="test">
            <xsd:element name="operation">
              <xsd:complexType>
                 <xsd:element name="text1" type="xsd:string"/>
                 <xsd:element name="text2" type="xsd:string"/>
              </xsd:complexType>
            </xsd:element>
        </xsd:schema>
    </types>
    <message name="Request">
        <part name="body" element="tns:operation"/>
    </message>
    <message name="Response">
        <part name="body" element="tns:operation"/>
    </message>
...


En de bijbehorende request:
XML:
1
2
3
4
5
6
7
8
9
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:test="test">
   <soapenv:Header/>
   <soapenv:Body>
    <test:operation>
      <test:text1>?</test:text1>
      <test:text2>?</test:text2>
    </test:operation>
   </soapenv:Body>
</soapenv:Envelope>


Ik weet echter niet wat php hiervan gaat maken.


Trouwens, dat php niet klaagt als jouw request message 1 part heeft (goed) maar je response message 2 parts heeft (bad) zou niet mogen.

Verwijderd

Topicstarter
Ik was daar al bang voor. Toch was ik niet helemaal zeker na het zien van de specificaties. W3org is niet duidelijk volgens mij over 1 of meerdere parts per message. WS-I basic profile is wel helder: 1 message part is toegestaan.

Balen. Overigens krijg ik dus wel een response bericht met twee message parts goed terug. Alleen het request bericht met twee message parts gaat niet goed (met één wel).

Ik heb voorlopig wel iets gehackt door de HTTP_RAW_POST_DATA af te vangen en te hacken. Daarmee kan ik een request conform specs sturen en een response conform specs ontvangen. De complexere wsdl waar dit probleem uit is afgeleid ligt nl buiten mijn bereik :-)

Dank voor het kijken.

[ Voor 23% gewijzigd door Verwijderd op 16-08-2007 20:45 ]

Pagina: 1