In SOAP 1.1, the SOAP action is mentioned as a compulsory HTTP header. In practice it was used to identify the operation for a given request which we identify by the term ‘dispatching operations’.
As of SOAP 1.2, the SOAP action field became optional, and it was part of the content type header.
In WSF/PHP, you can use the “action” property of WSMessage to set the SOAP action in a request SOAP message.
$requestPayloadString = <<<XML <ns1:echoString xmlns:ns1="http://wso2.org/wsfphp/samples"> <text>Hello World!</text> </ns1:echoString> XML; $client = new WSClient(array( "to" => "http://localhost/samples/echo_service.php" )); $requestMessage = new WSMessage($requestPayloadString, array("action" => "http://localhost/samples/echo_service/echoString")); $responseMessage = $client->request($requestMessage); printf("Response = %s <br>", htmlspecialchars($responseMessage->str));
WSF/PHP send SOAP 1.2 request by default. So the SOAP message HTTP headers for the above code would be like this,
POST /samples/echo_service.php HTTP/1.1 User-Agent: Axis2C/1.5.0 Content-Length: 223 Content-Type: application/soap+xml;charset=UTF-8;action="http://localhost/samples/echo_service/echoString" Host: 127.0.0.1
Note that the SOAPÂ Action is sent in the Content-Type inside the optional action parameter.
If you set it to use SOAP 1.1 explicitly in the WSClient like this,
$client = new WSClient(array( "to" => "http://localhost/samples/echo_service.php", "useSOAP" => 1.1 ));
It would send the SOAP Action as a separate HTTP header,
POST /samples/echo_service.php HTTP/1.1 User-Agent: Axis2C/1.5.0 SOAPAction: "http://localhost/samples/echo_service/echoString" Content-Length: 225 Content-Type: text/xml;charset=UTF-8 Host: 127.0.0.1
If you are using WSF/PHP in the server side, you don’t need to worry about the SOAP version as it will support both SOAP 1.1 and SOAP 1.2 automatically.
Anyway you need to declared the actions to operations map, so WSF/PHP will be able to dispatch the SOAP request and direct the message to the correct operation.
function echoStringFunc($inMessage) { // logic of echoString operation } function echoIntFunc($inMessage) { // logic of echoInt operation } // we will take echoString and echoInt as tow operations $operations = array("echoString" => "echoStringFunction", "echoInt" => "echoIntFunction"); // soap action to operation map $actions = array("http://localhost/samples/echo_service/echoString" => "echoString", "http://localhost/samples/echo_service/echoInt" => "echoInt"); // creating the service with the operations and actions set $service = new WSService(array("operations" => $operations, "actions" => $actions)); $service->reply();
So whenever a SOAP request message hit this script, it will check the SOAPAction HTTP header if it is a SOAP 1.1 message, or the action parameter in the Content-Type HTTP header if it is 1.2, then try to find the function mapped with that action from the actions map.
Anyway if the SOAP action is not set in the request message WSF/PHP will try to dispatch the message with other methods like body based dispatching, WS-Addressing based dispatching which are transport protocol independent dispatching mechanisms.
Anyway since most of the cases SOAP is used on top of HTTP, it is really common SOAP messages are dispatched using the SOAP action which is no doubt a very easy and efficient way of dispatching.
Pingback: 5 Facts About WS-Addressing Action in WSF/PHP | Dimuthu's Blog