Hi All,
I need to create a new web-service by using php. And I need to use SOAP RPC/encoded for implementing this. I also need to authenticate the soap request using soap header information. Before doing main task that I have created a WSDL file, client and server files using php.
I have managed to send the soap request with header. But I am unaware of using the header information in the server side. That is I don't know how to check the header value is correct or not.
And I got error while I have setting "must-understand" to 1 or true. The error is "Header not understood".
I am listing our WSDL, soap request, client and server here.
Please guide me to create a good web service with authentication using soap headers.
Thank in advance
By Dipu
WSDL
<?xml version="1.0" encoding="ISO-8859-1"?>
<definitions xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/" xmlns:tns="http://localhost/dipu/webservices/" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns="http://schemas.xmlsoap.org/wsdl/" targetNamespace="http://localhost/dipu/webservices/">
<types>
<xsd:schema targetNamespace="http://localhost/dipu/webservices/">
<xsd:import namespace="http://schemas.xmlsoap.org/soap/encoding/"/>
<xsd:import namespace="http://schemas.xmlsoap.org/wsdl/"/>
</xsd:schema>
</types>
<message name="getCatalogEntryRequest">
<part name="catalogId" type="xsd:string"/>
<part name="catalogId2" type="xsd:string"/>
</message>
<message name="getCatalogEntryRequestHeader">
<part name="username" type="xsd:string"/>
</message>
<message name="getCatalogEntryResponse">
<part name="Result" type="xsd:string"/>
</message>
<portType name="CalculatorPortType">
<operation name="getCatalogEntry">
<documentation>adds two string values and returns the result</documentation>
<input message="tns:getCatalogEntryRequest"/>
<output message="tns:getCatalogEntryResponse"/>
</operation>
</portType>
<binding name="CalculatorBinding" type="tns:CalculatorPortType">
<soap:binding style="rpc" transport="http://schemas.xmlsoap.org/soap/http"/>
<operation name="getCatalogEntry">
<soapperation soapAction="http://localhost/dipu/webservices/#getCatalogEntry" style="rpc"/>
<input>
<soap:body use="encoded" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" namespace="http://localhost/dipu/webservices/"/>
<soap:header message="tns:getCatalogEntryRequestHeader" part="username" use="encoded" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" namespace="http://localhost/dipu/webservices/" />
</input>
<output>
<soap:body use="encoded" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" namespace="http://localhost/dipu/webservices/"/>
</output>
</operation>
</binding>
<service name="Calculator">
<port name="CalculatorPort" binding="tns:CalculatorBinding">
<soap:address location="http://localhost/study/webservices/soapwithheader/wsdl_server2.php"/>
</port>
</service>
</definitions>
SOAP Request
<SOAP-ENV:Envelope
xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:ns1="http://localhost/dipu/webservices/"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:ns2="http://namespace.example.com/"
xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/"
SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
<SOAP-ENV:Header>
<ns2:username>dipu</ns2:username>
</SOAP-ENV:Header>
<SOAP-ENV:Body>
<ns1:getCatalogEntry>
<catalogId xsi:type="xsd:string">catalog1</catalogId>
<catalogId2 xsi:type="xsd:string">catalogTest111</catalogId2>
</ns1:getCatalogEntry>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>
Client File
<?php
ini_set("soap.wsdl_cache_enabled", "0");
$client = new SoapClient("catalog.wsdl",array('trace' => 1 ));
$catalogId='catalog1';
$functions=$client->__getFunctions();
echo '<pre>';
print_r($functions);
// $soapHeader=new SoapHeader('http://soapinterop.org/echoheader/','username','hello world');
// $response = $client->getCatalogEntry('catalog1','catalogTest111', $soapHeader);
/*$bodyArr = array('catalog1', 'catalogTest111');
$response = $client->__soapCall('getCatalogEntry', $bodyArr,NULL,$soapHeader,NULL); */
// echo '--'.$client->__getLastRequest().'--';
$ns = 'http://namespace.example.com/';
//Body of the Soap Header.
$header = new SOAPHeader($ns, 'username', 'dipu');
$testArr = array('catalogId'=>'catalog1','catalogId2'=>'catalogTest111');
$response=$client->__soapCall("getCatalogEntry",$testArr,NULL, $header);
//Create Soap Header.
echo $client->__getLastRequest();
//echo $client->__getLastRequestHeaders();
echo $response;
?>
Server File
<?php
function getCatalogEntry($catalogId,$catalogId2) {
if($catalogId=='catalog1')
return "<HTML>
<HEAD>
<TITLE>Catalog</TITLE>
</HEAD
<BODY>
<p> </p>
<table border>
<tr><th>CatalogId</th>
<th>Journal</th><th>Section
</th><th>Edition</th><th>
Title</th><th>Author</th>
</tr><tr><td>catalog1</td>
<td>IBM developerWorks</td><td>
XML</td><td>October 2005</td>
<td>JAXP validation</td>
<td>Brett McLaughlin</td></tr>
<tr><td>$catalogId2</td>
<td>IBM developerWorks</td><td>
XML</td><td>October 2005</td>
<td>JAXP validation</td>
<td>Brett McLaughlin</td></tr>
</table>
</BODY>
</HTML>";
elseif ($catalogId='catalog2')
return "<HTML>
<HEAD>
<TITLE>Catalog</TITLE>
</HEAD
<BODY>
<p> </p>
<table border>
<tr><th>CatalogId</th><th>
Journal</th><th>Section</th>
<th>Edition</th><th>Title
</th><th>Author
</th></tr><tr><td>catalog1
</td><td>IBM developerWorks</td>
<td>XML</td><td>July 2006</td>
<td>The Java XPath API
</td><td>Elliotte Harold</td>
</tr><tr><td>$catalogId2
</td><td>IBM developerWorks</td>
<td>XML</td><td>July 2006</td>
<td>The Java XPath API
</td><td>Elliotte Harold</td>
</tr>
</table>
</BODY>
</HTML>";
}
ini_set("soap.wsdl_cache_enabled", "0");
$server = new SoapServer("catalog.wsdl");
$server->addFunction("getCatalogEntry");
$server->handle();
?>