#50064 [Opn]: SOAP response by is not encoded
| From: | srinatar@php.net | Date: | Sat, 07 Nov 2009 00:28:00 +0000 |
| Subject: | #50064 [Opn]: SOAP response by is not encoded | ||
| References: | 1 | Groups: | php.bugs |
| Request: | Send a blank email to php-bugs+get-144325@lists.php.net to get a copy of this message | ||
ID: 50064
Updated by: srinatar@php.net
Reported By: ckl at ecw dot de
Status: Open
Bug Type: SOAP related
Operating System: Windows XP SP3
PHP Version: 5.2.11
New Comment:
Ok, i am able to reproduce this issue when using php on windows and
unable to do so when using php on linux. php on windows uses libxml2
2.7.3 version. i wonder, if this issue has some thing to do with how
libxml2 (dependent library) is built on windows.
Previous Comments:
------------------------------------------------------------------------
[2009-11-05 11:25:35] ckl at ecw dot de
srinatar, which test case do you need?
The problem is, that the WSDL file is automatically created by
Spring-WS. Spring-WS parses a XSD-file and creates the WSDL below.
It seems to be, that your SOAP test-case does not make use of the
<wsdl:definitions ...
xmlns:tns="http://www.ecw.de/adg/person/schema/beans">
namespace
definition.
The given WSDL above is valid and can be parsed by PHP on my system.
Do you have any suggestions?
Could your and my problem be related to libxml2 (thanks for the hint)
and namespace parsing?
------------------------------------------------------------------------
[2009-11-04 22:39:40] srinatar@php.net
will it be to provide a test case where this problem is reproduced.
This would allow us to look further on this issue. the below provided
information doesn't seem to be enough to reproduce this problem
when I tried your interface.wsdl, I get the below error :
Message = SoapFault exception: [WSDL] SOAP-ERROR: Parsing WSDL: Missing
<message> with name 'tns:findUserResponse' in
/export/home/sriramn/scripts/PHP/soap-client-3.php:10
Stack trace:
looks like the interface.wsdl is missing some information.
to answer your other question, php internally uses libxml2 to parse the
xml file.
------------------------------------------------------------------------
[2009-11-03 16:28:17] ckl at ecw dot de
Description:
------------
I developed a Spring-WS webservice which I try to call by PHP.
WSDL file:
---
<?xml version="1.0" encoding="UTF-8"?><wsdl:definitions
xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
xmlns:sch="http://www.ecw.de/adg/person/schema/beans"
xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
xmlns:tns="http://www.ecw.de/adg/person/schema/beans"
targetNamespace="http://www.ecw.de/adg/person/schema/beans">
<wsdl:types>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:jaxb="http://java.sun.com/xml/ns/jaxb"
xmlns="http://www.ecw.de/adg/person/schema/beans"
xmlns:pb="http://www.ecw.de/adg/person/schema/beans"
xmlns:schemas="http://www.ecw.de/adg/person/schema/beans"
xmlns:xjc="http://java.sun.com/xml/ns/jaxb/xjc"
attributeFormDefault="unqualified" elementFormDefault="unqualified"
jaxb:extensionBindingPrefixes="xjc" jaxb:version="1.0"
targetNamespace="http://www.ecw.de/adg/person/schema/beans"
xmlns:tns="http://www.ecw.de/adg/person/schema/beans">
<xs:annotation>
<xs:appinfo>
<jaxb:globalBindings>
<xjc:simple/>
</jaxb:globalBindings>
</xs:appinfo>
</xs:annotation>
<xs:complexType name="person">
<xs:sequence>
<xs:element maxOccurs="1" minOccurs="1" name="canonicalName"
nillable="true" type="xs:string"/>
<xs:element maxOccurs="1" minOccurs="1" name="commonName"
nillable="true" type="xs:string"/>
<xs:element maxOccurs="1" minOccurs="1" name="createTimeStamp"
nillable="true" type="xs:string"/>
<xs:element maxOccurs="1" minOccurs="1" name="description"
nillable="true" type="xs:string"/>
<xs:element maxOccurs="1" minOccurs="1" name="name"
nillable="true"
type="xs:string"/>
<xs:element maxOccurs="1" minOccurs="1" name="objectCategory"
nillable="true" type="xs:string"/>
<xs:element maxOccurs="1" minOccurs="1" name="whenCreated"
nillable="true" type="xs:string"/>
<xs:element maxOccurs="1" minOccurs="1" name="distinguishedName"
nillable="true" type="xs:string"/>
<xs:element maxOccurs="1" minOccurs="1" name="mail"
nillable="true"
type="xs:string"/>
<xs:element maxOccurs="1" minOccurs="1" name="displayName"
nillable="true" type="xs:string"/>
<xs:element maxOccurs="1" minOccurs="1" name="objectClass"
nillable="true" type="xs:string"/>
<xs:element maxOccurs="1" minOccurs="1" name="sAMAccountName"
nillable="true" type="xs:string"/>
<xs:element maxOccurs="1" minOccurs="1" name="memberOf"
nillable="true" type="pb:groupCollection"/>
<xs:element maxOccurs="1" minOccurs="1" name="employeeNumber"
nillable="true" type="xs:string"/>
<xs:element maxOccurs="1" minOccurs="1" name="givenName"
nillable="true" type="xs:string"/>
<xs:element maxOccurs="1" minOccurs="0" name="homeDirectory"
nillable="true" type="xs:string"/>
<xs:element maxOccurs="1" minOccurs="1" name="homePhone"
nillable="true" type="xs:string"/>
<xs:element maxOccurs="1" minOccurs="1" name="lastLogon"
nillable="true" type="xs:string"/>
<xs:element maxOccurs="1" minOccurs="1" name="logonCount"
nillable="true" type="xs:int"/>
<xs:element maxOccurs="1" minOccurs="1" name="mailNickname"
nillable="true" type="xs:string"/>
<xs:element maxOccurs="1" minOccurs="1" name="allowDialin"
nillable="true" type="xs:boolean"/>
<xs:element maxOccurs="1" minOccurs="1" name="profilePath"
nillable="true" type="xs:string"/>
<xs:element maxOccurs="1" minOccurs="1" name="userPrincipalName"
nillable="true" type="xs:string"/>
<xs:element maxOccurs="1" minOccurs="1"
name="additionalAttributes"
nillable="true" type="pb:additionalAttributesCollectionType"/>
</xs:sequence>
</xs:complexType>
<xs:complexType name="groupCollection">
<xs:sequence>
<xs:element maxOccurs="unbounded" minOccurs="0" name="groupName"
type="xs:string"/>
</xs:sequence>
</xs:complexType>
<xs:complexType name="additionalAttributesCollectionType">
<xs:sequence>
<xs:element maxOccurs="unbounded" minOccurs="0" name="attribute"
nillable="false" type="pb:additionalAttributeType">
</xs:element>
</xs:sequence>
</xs:complexType>
<xs:complexType name="additionalAttributeType">
<xs:sequence>
<xs:element maxOccurs="1" minOccurs="1" name="value"
type="xs:string"/>
</xs:sequence>
<xs:attribute name="name" type="xs:string" use="required"/>
</xs:complexType>
<xs:complexType name="defaultAuthenticationResponse">
<xs:sequence>
<xs:element default="false" maxOccurs="1" minOccurs="1"
name="valid"
nillable="false" type="xs:boolean"/>
<xs:element default="0" minOccurs="0" name="statusCode"
nillable="true" type="xs:integer"/>
<xs:element maxOccurs="1" minOccurs="0" name="reason"
nillable="true" type="xs:string"/>
</xs:sequence>
</xs:complexType>
<xs:element name="findUserRequest">
<xs:complexType>
<xs:sequence>
<xs:element name="sAMAccountName" type="xs:string"/>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="findUserResponse">
<xs:complexType>
<xs:sequence>
<xs:element name="person" type="pb:person"/>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="isUserAAARequest">
<xs:complexType>
<xs:sequence>
<xs:element maxOccurs="1" minOccurs="1" name="sAMAccountName"
nillable="false" type="xs:string"/>
<xs:element maxOccurs="1" minOccurs="1" name="credential"
nillable="false" type="xs:string"/>
<xs:element maxOccurs="1" minOccurs="1" name="neededGroups"
nillable="false" type="pb:groupCollection"/>
<xs:element maxOccurs="1" minOccurs="1"
name="memberShipIsNeededInAllGroups" nillable="false"
type="xs:boolean"/>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="isUserAAAResponse"
type="pb:defaultAuthenticationResponse"/>
<xs:element name="isUserAuthenticatedRequest">
<xs:complexType>
<xs:sequence>
<xs:element maxOccurs="1" minOccurs="0" name="sAMAccountName"
nillable="false" type="xs:string"/>
<xs:element maxOccurs="1" minOccurs="1" name="credential"
nillable="false" type="xs:string"/>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="isUserAuthenticatedResponse"
type="pb:defaultAuthenticationResponse"/>
<xs:element name="isUserAuthorizedRequest">
<xs:complexType>
<xs:sequence>
<xs:element maxOccurs="1" minOccurs="0" name="sAMAccountName"
nillable="false" type="xs:string"/>
<xs:element maxOccurs="1" minOccurs="1" name="neededGroups"
nillable="false" type="pb:groupCollection"/>
<xs:element maxOccurs="1" minOccurs="1"
name="memberShipIsNeededInAllGroups" nillable="false"
type="xs:boolean"/>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="isUserAuthorizedResponse"
type="pb:defaultAuthenticationResponse"/>
</xs:schema>
</wsdl:types>
<wsdl:message name="isUserAuthenticatedRequest">
<wsdl:part element="tns:isUserAuthenticatedRequest"
name="isUserAuthenticatedRequest">
</wsdl:part>
</wsdl:message>
<wsdl:message name="findUserResponse">
<wsdl:part element="tns:findUserResponse" name="findUserResponse">
</wsdl:part>
</wsdl:message>
<wsdl:message name="findUserRequest">
<wsdl:part element="tns:findUserRequest" name="findUserRequest">
</wsdl:part>
</wsdl:message>
<wsdl:message name="isUserAuthorizedResponse">
<wsdl:part element="tns:isUserAuthorizedResponse"
name="isUserAuthorizedResponse">
</wsdl:part>
</wsdl:message>
<wsdl:message name="isUserAAAResponse">
<wsdl:part element="tns:isUserAAAResponse"
name="isUserAAAResponse">
</wsdl:part>
</wsdl:message>
<wsdl:message name="isUserAuthenticatedResponse">
<wsdl:part element="tns:isUserAuthenticatedResponse"
name="isUserAuthenticatedResponse">
</wsdl:part>
</wsdl:message>
<wsdl:message name="isUserAAARequest">
<wsdl:part element="tns:isUserAAARequest" name="isUserAAARequest">
</wsdl:part>
</wsdl:message>
<wsdl:message name="isUserAuthorizedRequest">
<wsdl:part element="tns:isUserAuthorizedRequest"
name="isUserAuthorizedRequest">
</wsdl:part>
</wsdl:message>
<wsdl:portType name="Person">
<wsdl:operation name="isUserAAA">
<wsdl:input message="tns:isUserAAARequest"
name="isUserAAARequest">
</wsdl:input>
<wsdl:output message="tns:isUserAAAResponse"
name="isUserAAAResponse">
</wsdl:output>
</wsdl:operation>
<wsdl:operation name="isUserAuthorized">
<wsdl:input message="tns:isUserAuthorizedRequest"
name="isUserAuthorizedRequest">
</wsdl:input>
<wsdl:output message="tns:isUserAuthorizedResponse"
name="isUserAuthorizedResponse">
</wsdl:output>
</wsdl:operation>
<wsdl:operation name="findUser">
<wsdl:input message="tns:findUserRequest"
name="findUserRequest">
</wsdl:input>
<wsdl:output message="tns:findUserResponse"
name="findUserResponse">
</wsdl:output>
</wsdl:operation>
<wsdl:operation name="isUserAuthenticated">
<wsdl:input message="tns:isUserAuthenticatedRequest"
name="isUserAuthenticatedRequest">
</wsdl:input>
<wsdl:output message="tns:isUserAuthenticatedResponse"
name="isUserAuthenticatedResponse">
</wsdl:output>
</wsdl:operation>
</wsdl:portType>
<wsdl:binding name="PersonSoap11" type="tns:Person">
<soap:binding style="document"
transport="http://schemas.xmlsoap.org/soap/http"/>
<wsdl:operation name="isUserAAA">
<soap:operation soapAction=""/>
<wsdl:input name="isUserAAARequest">
<soap:body use="literal"/>
</wsdl:input>
<wsdl:output name="isUserAAAResponse">
<soap:body use="literal"/>
</wsdl:output>
</wsdl:operation>
<wsdl:operation name="isUserAuthorized">
<soap:operation soapAction=""/>
<wsdl:input name="isUserAuthorizedRequest">
<soap:body use="literal"/>
</wsdl:input>
<wsdl:output name="isUserAuthorizedResponse">
<soap:body use="literal"/>
</wsdl:output>
</wsdl:operation>
<wsdl:operation name="findUser">
<soap:operation soapAction=""/>
<wsdl:input name="findUserRequest">
<soap:body use="literal"/>
</wsdl:input>
<wsdl:output name="findUserResponse">
<soap:body use="literal"/>
</wsdl:output>
</wsdl:operation>
<wsdl:operation name="isUserAuthenticated">
<soap:operation soapAction=""/>
<wsdl:input name="isUserAuthenticatedRequest">
<soap:body use="literal"/>
</wsdl:input>
<wsdl:output name="isUserAuthenticatedResponse">
<soap:body use="literal"/>
</wsdl:output>
</wsdl:operation>
</wsdl:binding>
<wsdl:service name="PersonService">
<wsdl:port binding="tns:PersonSoap11" name="PersonSoap11">
<soap:address
location="http://localhost:8080/ADG/personService"/>
</wsdl:port>
</wsdl:service>
</wsdl:definitions>
---
Response from Spring-WS (fetched by proxying the request/response):
---
<SOAP-ENV:Envelope
xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
<SOAP-ENV:Header/>
<SOAP-ENV:Body>
<ns3:person
xmlns:ns3="http://www.ecw.de/adg/person/schema/beans">
<canonicalName xsi:nil="true"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"/>
<commonName xsi:nil="true"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"/>
<createTimeStamp xsi:nil="true"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"/>
<description>desc</description>
<name>name</name>
<objectCategory>CN=Person,CN=Schema,CN=Configuration,DC=dc,DC=com</objectCategory>
<whenCreated>200000000</whenCreated>
<distinguishedName>CN=...</distinguishedName>
<mail>mail@domain.com</mail>
<displayName>display-name</displayName>
<objectClass>top</objectClass>
<sAMAccountName>test</sAMAccountName>
<memberOf>
<groupName>Some groupname</groupName>
</memberOf>
<employeeNumber>123</employeeNumber>
<givenName>test</givenName>
<homePhone xsi:nil="true"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"/>
<lastLogon>129017292450890526</lastLogon>
<logonCount>7021</logonCount>
<mailNickname>test</mailNickname>
<allowDialin>false</allowDialin>
<profilePath>\\srv\profiles</profilePath>
<userPrincipalName>test@domain.com</userPrincipalName>
<additionalAttributes xsi:nil="true"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"/>
</ns3:person>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>
---
It seems to be that SOAPClient or the underlying XML library
(SimpleXML? - not sure which XML-library is used by SOAPClient) is not
able to handle the namespaces in response.
Reproduce code:
---------------
<?php
define('WSDL', 'path_to_wsdl');
// tried already all possible combinations with and without uri
$client = new SoapClient(WSDL, array('trace' => true, 'version' =>
SOAP_1_1, 'exceptions' => true, 'uri' =>
'http://www.ecw.de/adg/person/schema/beans'));
$func = "findUser"
$req['findUserRequest']['sAMAccountName'] = 'test';
// tried already all possible combinations with and without uri
$result = $client->__soapCall($func, $req, array('uri' =>
"http://www.ecw.de/adg/person/schema/beans"));
print_r($result); // results in NULL and *not* object
?>
Expected result:
----------------
expected: object { name = 'test' , .... }
Actual result:
--------------
NULL
------------------------------------------------------------------------
--
Edit this bug report at http://bugs.php.net/?id=50064&edit=1