|
PHP SOAP Extension - Server Applications
Part:
1
2
3
4
(Continued from previous part...)
Remember to move HelloServer12.php to IIS document directory. Then run HelloClient12.php.
You will get:
Returning value of __soapCall() call: Hello world! - SOAP 1.2
Dumping request headers:
POST /HelloServer12.php HTTP/1.1
Host: localhost
Connection: Keep-Alive
User-Agent: PHP SOAP 0.1
Content-Type: application/soap+xml;
charset=utf-8; action="urn://www.herong.home/req#hello"
Content-Length: 458
Dumping request:
<?xml version="1.0" encoding="UTF-8"?>
<env:Envelope
xmlns:env="http://www.w3.org/2003/05/soap-envelope"
xmlns:ns1="urn://www.herong.home/req"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:enc="http://www.w3.org/2003/05/soap-encoding">
<env:Body>
<ns1:hello
env:encodingStyle="http://www.w3.org/2003/05/soap-encoding">
<param0 xsi:type="xsd:string">world</param0>
</ns1:hello>
</env:Body>
</env:Envelope>
Dumping response headers:
HTTP/1.1 200 OK
Server: Microsoft-IIS/5.1
Connection: close
Content-Type: application/soap+xml; charset=utf-8
X-Powered-By: PHP/5.0.4
Content-Length: 570
Dumping response:
<?xml version="1.0" encoding="UTF-8"?>
<env:Envelope
xmlns:env="http://www.w3.org/2003/05/soap-envelope"
xmlns:ns1="urn://www.herong.home/res"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:enc="http://www.w3.org/2003/05/soap-encoding">
<env:Body
xmlns:rpc="http://www.w3.org/2003/05/soap-rpc">
<ns1:helloResponse
env:encodingStyle="http://www.w3.org/2003/05/soap-encoding">
<rpc:result>return</rpc:result>
<return xsi:type="xsd:string">Hello world! - SOAP 1.2</return>
</ns1:helloResponse>
</env:Body>
</env:Envelope>
Now the output is more interesting:
- SOAP 1.2 HTTP Binding rules are applied. See the HTTP request header line: Content-Type.
It has a value of "application/soap+xml", and parameter of "action=...".
- SOAP 1.2 Message rules are applied. See the envelope namespace value in both request message
and response message: xmlns:env="http://www.w3.org/2003/05/soap-envelope.
- SOAP 1.2 RPC Presentation rules are applied. See the "result" sub element in the response element
of the response message. But SOAP Extension does not put the returning value directly in this sub element.
It inserts a second sub element in the response element, and puts the returning value in this second element.
The value in the required "result" element is just a reference to the second element. This seems to be violating
the SOAP 1.2 RPC Presentation specifications.
HelloServerWsdl.php - SOAP 1.2 Server Application in WSDL Mode
Now let's move forward one step further: creating a SOAP 1.2 server application in WSDL mode.
Here is the same hello server modified to work in WSDL mode, HelloServerWdsl.php:
<?php # HelloServerWsdl.php
# Copyright (c) 2005 by Dr. Herong Yang
#
function hello($someone) {
return "Hello " . $someone . "! - With WSDL";
}
ini_set("soap.wsdl_cache_enabled", "0");
$server = new SoapServer("http://localhost/Hello.wsdl",
array('soap_version' => SOAP_1_2));
$server->addFunction("hello");
$server->handle();
?>
Nothing special in the program. The server object is now created with the location of the WSDL document.
Here is the WSDL document, Hello.wsdl
<?xml version="1.0"?>
<definitions name="MyDefinition"
targetNamespace="urn:myTargetNamespace"
xmlns:tns="urn:myTns"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
xmlns="http://schemas.xmlsoap.org/wsdl/">
<message name="myRequest">
<part name="reqParam" type="xsd:string"/>
</message>
<message name="myResponse">
<part name="resParam" type="xsd:string"/>
</message>
<portType name="MyPortType">
<operation name="hello">
<input message="tns:myRequest"/>
<output message="tns:myResponse"/>
</operation>
</portType>
<binding name="MyBinding" type="tns:MyPortType">
<soap:binding style="rpc"
transport="http://schemas.xmlsoap.org/soap/http"/>
<operation name="hello">
<soap:operation soapAction=""/>
<input>
<soap:body use="encoded"
namespace="urn:myInputNamespace"
encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>
</input>
<output>
<soap:body use="encoded"
namespace="urn:myOutputNamespace"
encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>
</output>
</operation>
</binding>
<service name="MyService">
<documentation>Returns a greeting string.
</documentation>
<port name="MyPort" binding="tns:MyBinding">
<soap:address
location="http://localhost/HelloServerWsdl.php"/>
</port>
</service>
</definitions>
(Continued on next part...)
Part:
1
2
3
4
|