PHPerKaigi 2024

The SoapHeader class

(PHP 5, PHP 7, PHP 8)

Introdução

Represents a SOAP header.

Resumo da classe

class SoapHeader {
/* Propriedades */
public string $name;
public mixed $data = null;
/* Métodos */
public __construct(
    string $namespace,
    string $name,
    mixed $data = ?,
    bool $mustunderstand = ?,
    string $actor = ?
)
}

Propriedades

actor

data

mustUnderstand

name

namespace

Índice

add a note

User Contributed Notes 5 notes

up
16
john at jtresponse dot co dot uk
11 years ago
None of the examples really do it for me.
Note: you should NOT need to hard-code any XML.

Here is an example of creating a nested header and including a parameter.

$client = new SoapClient(WSDL,array());

$auth = array(
'UserName'=>'USERNAME',
'Password'=>'PASSWORD',
'SystemId'=> array('_'=>'DATA','Param'=>'PARAM'),
);
$header = new SoapHeader('NAMESPACE','Auth',$auth,false);
$client->__setSoapHeaders($header);

Gives the following header XML:

<SOAP-ENV:Header>
<ns1:Auth>
<ns1:SystemId Param="PARAM">DATA</ns1:SystemId>
<ns1:UserName>USERNAME</ns1:UserName>
<ns1:Password>PASSWORD</ns1:Password>
</ns1:Auth>
</SOAP-ENV:Header>
up
2
abdul dot rashid at paytabs dot co
7 years ago
Just to add some note regarding his john at jtresponse dot co dot uk

In PHP you can try following code to avoid the <item><key/>

$Auth = new stdClass();
$Auth->SystemId = "DATA";
$Auth->UserName = "USERNAME";
$Auth->Password = "PASSWORD";

$header = new SoapHeader('NAMESPACE','Auth',$Auth,false);
$soapClient->__setSoapHeaders($header);

<SOAP-ENV:Header>
<ns1:Auth>
<ns1:SystemId>DATA</ns1:SystemId>
<ns1:UserName>USERNAME</ns1:UserName>
<ns1:Password>PASSWORD</ns1:Password>
</ns1:Auth>
</SOAP-ENV:Header>
up
2
mixmaster1413 at gmail dot com
8 months ago
Something I came across that I feel should be noted here is if you come across the error "cannot be processed at the receiver, due to an addressfilter mismatch at the endpointdispatcher. check that the sender and receiver's endpointaddresses agree." and you are absolutely sure your protocols and the service URL matches, send 'To' SoapHeader.

$soapHeaders = array(
new \SoapHeader('http://www.w3.org/2005/08/addressing', 'Action', 'your-action', true),
new \SoapHeader('http://www.w3.org/2005/08/addressing', 'To', 'your-service-endpoint-url')
);
$soapClient->__setSoapHeaders($soapHeaders);
up
-1
ericvaneldik at gmail dot com
4 years ago
If you want to create an soap header wihtout namespace and without an item key value setup, you can use SoapVar

To get this:
<SOAP-ENV:Header>
<IdentityHeader>
<SessionID>123456789</SessionID>
</IdentityHeader>
</SOAP-ENV:Header>

you can use this php code:
<?php
$headerVar
= new SoapVar('<IdentityHeader><SessionID>123456789</SessionID></IdentityHeader>',
XSD_ANYXML);
$header = new SoapHeader('http://tempuri.org/','RequestParams',
$headerVar);
?>
up
-11
voroks at logics dot net dot au
8 years ago
Example by john at jtresponse dot co dot uk does miss one important point: to be able to add attributes they must be mentioned in WSDL. If they not exist in WSDL they WILL NOT appear as attributes but rather <item><key/><value/></item> elements.
To Top