Web services

Hi

 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.

WSDL

<?xml version="1.0" encoding="ISO-8859-1"?> adds two string values and returns the result

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:usernamedipu</ns2:username>
</SOAP-ENV:Header>
SOAP-ENV:Body
ns1:getCatalogEntry
catalog1
catalogTest111
</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 '
';
  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 " Catalog </HEAD

CatalogId Journal Section Edition Title Author
catalog1 IBM developerWorks XML October 2005 JAXP validation Brett McLaughlin
$catalogId2 IBM developerWorks XML October 2005 JAXP validation Brett McLaughlin
"; elseif ($catalogId='catalog2') return " Catalog </HEAD

CatalogId Journal Section Edition Title Author
catalog1 IBM developerWorks XML July 2006 The Java XPath API Elliotte Harold
$catalogId2 IBM developerWorks XML July 2006 The Java XPath API Elliotte Harold
"; } ini_set("soap.wsdl_cache_enabled", "0"); $server = new SoapServer("catalog.wsdl"); $server->addFunction("getCatalogEntry"); $server->handle(); ?>

Hum, I don’t think you’ll got lot of support here as it’s more wM centric.
May I suggest to send your request directly to a PHP forum ?

Anyway, I can’t help you as I have wrote only PHP client up to now :frowning: But if you find an answer, can you please copy it here as I’m interested on the subject.

Thanks

Laurent

Hi laurent faillie,

                       Thank you for your quick response. I will post the answer, if I get it. It is helpful for to get links of some good php forum.

Thanks

Dipu

Google / Yahoo will be your friend because the only PHP forums I know are in French :o

Hi laurent faillie,

Thank you for your reply.

Thanks

Dipu

Hi All,

Thank you for your reply. I have manged to solve the problem by modify the WSDL , server file and the client file. Now It is able to send and manipulate the soap header information.

Dipu

WSDL FIle


<?xml version ='1.0' encoding ='UTF-8' ?>
<definitions name='SayHello' targetNamespace='urn:SayHello'
xmlns:tns='urn:SayHello'
xmlns:soap='http://schemas.xmlsoap.org/wsdl/soap/'
xmlns:xsd='http://www.w3.org/2001/XMLSchema'
xmlns:soapenc='http://schemas.xmlsoap.org/soap/encoding/'
xmlns:wsdl='http://schemas.xmlsoap.org/wsdl/'
xmlns='http://schemas.xmlsoap.org/wsdl/'>

<message name='getHelloRequest'>
<part name='name' type='xsd:string'/>
</message>

<message name='validateRequest'>
<part name='username' type='xsd:string'/>
<part name='password' type='xsd:string'/>
</message>

<message name='validateResponse'>
<part name='testReturn' type='xsd:string'/>
</message>

<message name='getHelloResponse'>
<part name='Result' type='xsd:string'/>
</message>

<portType name='SayHelloPortType'>
<operation name='getHello'>
<input message='tns:getHelloRequest'/>
<output message='tns:getHelloResponse'/>
</operation>
<operation name='validate'>
<input message='tns:validateRequest'/>
<output message='tns:validateResponse'/>
</operation>
</portType>

<binding name='SayHelloBinding' type='tns:SayHelloPortType'>
<soap:binding style='rpc'
transport='http://schemas.xmlsoap.org/soap/http'/>
<operation name='getHello'>
<soap:operation soapAction='urn:SayHello#getQuote'/>
<input>
<soap:body use='encoded' namespace='urn:SayHello'
encodingStyle='http://schemas.xmlsoap.org/soap/encoding/'/>
</input>
<output>
<soap:body use='encoded' namespace='urn:SayHello'
encodingStyle='http://schemas.xmlsoap.org/soap/encoding/'/>
</output>
</operation>

<operation name='validate'>
<soap:operation soapAction='urn:SayHello#getQuote'/>
<input>
<soap:body use='encoded' namespace='urn:SayHello'
encodingStyle='http://schemas.xmlsoap.org/soap/encoding/'/>
</input>
<output>
<soap:body use='encoded' namespace='urn:SayHello'
encodingStyle='http://schemas.xmlsoap.org/soap/encoding/'/>
</output>
</operation>
</binding>

<service name='SayHelloService'>
<port name='SayHelloPort' binding='SayHelloBinding'>
<soap:address location='URL to your server location'/>
</port>
</service>
</definitions>

SOAP Request


<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"
	xmlns:ns1="urn:SayHello" xmlns:xsd="http://www.w3.org/2001/XMLSchema"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:ns2="urn:example.org/auth"
	xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/"
	SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
	<SOAP-ENV:Header>
		<ns2:validate>
			<username>username</username>
			<password>password</password>
		</ns2:validate>
	</SOAP-ENV:Header>
	<SOAP-ENV:Body>
		<ns1:getHello>
			<name xsi:type="xsd:string">catalog1</name>
		</ns1:getHello>
	</SOAP-ENV:Body>
</SOAP-ENV:Envelope>

Server file


<?php 

class SayHello { 
public function getHello($inmessage) { 
return "Hello $inmessage!"; 
} 
public function validate($username,$password) { 
    if($username!='username' || $password!='password'){ 
         throw new SOAPFault("Incorrect username and password combination.", 401); 
    } 

} 

} //end class 
ini_set("soap.wsdl_cache_enabled", "0"); 
$server = new SoapServer("test_class.wsdl"); 
$server->setClass("SayHello"); 
$server->handle(); 
$functions=$server->getFunctions(); 

?>

Client File


<?php 
  ini_set("soap.wsdl_cache_enabled", "0"); 
  $client = new SoapClient("test_class.wsdl",array('trace' => 1 )); 
  $catalogId='catalog1'; 
  $functions=$client->__getFunctions(); 
  echo '<pre>'; 
  print_r($functions); 

   
class SOAPAuth { 
    public $username; 
    public $password; 

    public function __construct($username, $password) { 
        $this->username = $username; 
        $this->password = $password; 
    } 
} 
    $ns = 'http://namespace.example.com/'; 
    //Body of the Soap Header. 
    if(@$_GET['username']!='')$username    =$_GET['username'];else $username    = 'username'; 
    if(@$_GET['password']!='')$password    =$_GET['password'];else $password    = 'password'; 

    $auth = new SOAPAuth($username,$password); 
    $header = new SOAPHeader('urn:example.org/auth', 'validate', $auth);
    $testArr    = array('testString'=>'catalog1'); 
try{ 
    $response=$client->__soapCall("getHello",$testArr,NULL, $header); 
     

    echo $client->__getLastRequest(); 
   print_r($response); 
}catch (SOAPFault $exception) { 
    echo '<pre>'; 
    print_r($exception); 
} 
?>

Hi Dipu,

It will be very helpful if you can mention what changed you have done to make it work.

I am interested from WSDL, SOAP Request perspective.

Regards,
Hemanth