SoapServer can't return a header unless one is sent

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Hello,

I finally got soap headers to work (yay!), but I can't figure out how to send a header that I didn't receive, since receiving a header seems to be what invokes the magic function.

For example, I had a sessionId header. The client makes its first call and doesn't not yet have a session initiated. I want the server to always send a sessionId header, whether it received one or not.

Here is a small reproduction. Comment/uncomment the soapenv:Header to see what I am talking about:


***** test.php *****

<?php

ini_set("soap.wsdl_cache_enabled", 0);


$request = <<<REQUEST
<?xml version="1.0" encoding="UTF-8"?><soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"; xmlns:xsd="http://www.w3.org/2001/XMLSchema"; xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance";>

<!--
<soapenv:Header><ns1:sessionId soapenv:actor="http://schemas.xmlsoap.org/soap/actor/next"; soapenv:mustUnderstand="0" xsi:type="soapenc:string" xmlns:ns1="http://xml.apache.org/axis/session"; xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/";>THIS IS CLIENT SESSION!</ns1:sessionId></soapenv:Header>
-->

<soapenv:Body><ns2:getProduct soapenv:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"; xmlns:ns2="urn:com.plauditdesign.shoppingcart.client#"><productId href="#id0"/></ns2:getProduct><multiRef id="id0" soapenc:root="0" soapenv:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"; xsi:type="xsd:int" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/";>236</multiRef></soapenv:Body></soapenv:Envelope>
REQUEST;



class CatalogFacade {
	public function sessionId( $id ) {
		echo "<!-- sessionId! $id -->";
		return "FROM SERVER: $id";
	}

	public function getProduct( $id ) {
		return "PRODUCT $id";
	}
}


$server = new SoapServer( "CatalogFacade.wsdl" );
$server->setClass( "CatalogFacade");
$server->handle( $request );


?>



***** CatalogFacade.wsdl *****

<?xml version="1.0" encoding="utf-8"?>
<definitions name="shoppingcart"
	xmlns="http://schemas.xmlsoap.org/wsdl/";
xmlns:tns="urn:com.plauditdesign.shoppingcart.client#" targetNamespace="urn:com.plauditdesign.shoppingcart.client#"
	xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/";
	xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/";
	xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/";
	xmlns:xs="http://www.w3.org/2001/XMLSchema";
	
	xmlns:axis-session="http://xml.apache.org/axis/session";
	
	xmlns:types="urn:com.plauditdesign.shoppingcart.client.types#">
	<!-- all datatypes will be imported to namespace types: -->
	<types>
		
		
        <schema xmlns="http://www.w3.org/2001/XMLSchema";
                targetNamespace="http://xml.apache.org/axis/session";>
                <element name="sessionId" type="xs:string"/>
        </schema>
	
		
	</types>

	<!-- Obviously, the value for @location is wrong!
	<import namespace="urn:com.plauditdesign.shoppingcart.client#"
	location='http://www.example.org/schema/sample.xsd'/>
	-->
	
	
        <message name="sessionIdRequest">
                <part name="sessionId" element="axis-session:sessionId"/>
        </message>
        <message name="sessionIdResponse">
                <part name="sessionId" element="axis-session:sessionId"/>
        </message>


	<message name="getProduct-request">
		<part name="productId" type="xs:int"/>
	</message>
	<message name="getProduct-response">
		<part name="result" type="xs:string"/>
	</message>

	<portType name="catalog-porttype">
	
		<operation name="getProduct" parameterOrder="productId">
			<input name="getProduct-request" message="tns:getProduct-request"/>
			<output name="getProduct-response" message="tns:getProduct-response"/>
		</operation>
	</portType>

	<!-- @type doesn't like tns: -->
	<binding name="catalog-binding" type="tns:catalog-porttype">
		<!--
		<soap:binding style="document"
			transport="http://schemas.xmlsoap.org/soap/http"/>
		-->
		<soap:binding style="rpc"
			transport="http://schemas.xmlsoap.org/soap/http"/>
		
		
		<operation name="getProduct">
<soap:operation soapAction="urn:com.plauditdesign.shoppingcart.client.CatalogFacade#getProduct"/>
			<input>
<soap:body use="encoded" namespace="urn:com.plauditdesign.shoppingcart.client#" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/> <soap:header message="tns:sessionIdRequest" part="sessionId" use="encoded" encodingStyle="http://www.w3.org/2003/05/soap-encoding"/>
				
			</input>
			<output>
<soap:body use="encoded" namespace="urn:com.plauditdesign.shoppingcart.client#" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/> <soap:header message="tns:sessionIdResponse" part="sessionId" use="encoded" encodingStyle="http://www.w3.org/2003/05/soap-encoding"/>
				
			</output>
		</operation>
		
	</binding>

	<service name="catalog">
		<!-- @binding doesn't like to be tns: -->
		<port name="catalog-port" binding="tns:catalog-binding">
<soap:address location="http://admin.plauditdesign.com/zencart/webservice/soap-index.php?server=Catalog"/>
		</port>
	</service>

</definitions>


Thanks!
Harlan

--
PHP Soap Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php


[Index of Archives]     [PHP Home]     [PHP Users]     [Kernel Newbies]     [PHP Database]     [Yosemite]

  Powered by Linux