PHP SoapClient: несоответствие действий - PullRequest
4 голосов
/ 22 декабря 2011

Я пытаюсь использовать расширение PHP SoapClient для связи с внешним сервером SOAP.

Это мой код:

$this->_client = new SoapClient(SOAP_TAGGING_URL, array(
    'trace' => 1, 
    'soap_version' => SOAP_1_2, 
    'cache_wsdl' => WSDL_CACHE_NONE, 
    'exceptions' => true, 
    'uri' => SOAP_URI, 
)); 
try { 
    $actionHdr = array(); 
    $actionHdr[] = new SoapHeader(SOAP_TAGGING_URL, 'Action', 'GetMessagesByTagsByGroup'); 
    $this->_client->__setSoapHeaders($actionHdr);
    $info = $this->_client->GetMessagesByTagsByGroup( 
        new SoapParam($this->params['mPID'], 'ParentMessageID'), 
        new SoapParam($gid, 'GroupId'), 
        new SoapParam(REQUEST_TOKEN, 'RequestToken'), 
        new SoapParam(ACCESS_TOKEN, 'AccessToken'), 
        new SoapParam(ACCESS_TOKEN_SECRET, 'AccessTokenSecret') 
    );  
} catch (SoapFault $fault) { 
    print("\n<br/>SOAP server returned the following ERROR: ".$fault->faultcode."-".$fault->faultstring); 
}

echo "\n<br/>SOAP request: ". htmlentities($this->_client->__getLastRequest());
echo "\n<br/>SOAP response: ". htmlentities($this->_client->__getLastResponse());

Это ответ, который я получаю (добавлено форматирование):

    SOAP server returned the following ERROR: s:Sender-The SOAP action specified on the message, '', does not match the HTTP SOAP Action,     'http://tempuri.org/ITagging/GetMessagesByTagsByGroup'. 
SOAP request: 
<?xml version="1.0" encoding="UTF-8"?> 
<env:Envelope xmlns:env="http://www.w3.org/2003/05/soap-envelope" xmlns:ns1="http://tempuri.org/" xmlns:ns2="https://mywebserver.com/myWSDL.svc/ws?wsdl">
    <env:Header>
        <ns2:Action>GetMessagesByTagsByGroup</ns2:Action>
    </env:Header>
    <env:Body>
        <ns1:GetMessagesByTagsByGroup/>
            <GroupId>2178</GroupId>
            <RequestToken>odwedwo09i0jACqbbjsw6KnlCA=</RequestToken>        
            <AccessToken>OlVbHurPJrNrEFR54Y0hV9kI/TZs=</AccessToken>
            <AccessTokenSecret>js1kerfe453FLuaXpL 892DY o=</AccessTokenSecret>
    </env:Body>
</env:Envelope> 
SOAP response: 
<s:Envelope xmlns:s="http://www.w3.org/2003/05/soap-envelope" xmlns:a="http://www.w3.org/2005/08/addressing">
<s:Header>
    <a:Action s:mustUnderstand="1">http://www.w3.org/2005/08/addressing/fault</a:Action>    
</s:Header>
    <s:Body>
        <s:Fault>
            <s:Code>
                <s:Value>s:Sender</s:Value>
                <s:Subcode>
                    <s:Value>a:ActionMismatch</s:Value>
                </s:Subcode>
            </s:Code>
            <s:Reason>
                <s:Text xml:lang="en-US">The SOAP action specified on the message, '', does not match the HTTP SOAP Action, 'http://tempuri.org/ITagging/GetMessagesByTagsByGroup'. </s:Text>
            </s:Reason>
            <s:Detail>
                <a:ProblemHeaderQName>a:Action</a:ProblemHeaderQName>
            </s:Detail>
        </s:Fault>
    </s:Body>
</s:Envelope>

Мне показалось, что я добавил параметр «Действие» в заголовок, но, очевидно, это не то место, где его можно поместить. Или я что-то не так делаю?

К сожалению, я не могу попробовать NuSoap, потому что у меня нет контроля над сервером.

Спасибо,

г

Ответы [ 2 ]

2 голосов
/ 22 декабря 2011

Это означает, что не только вы должны указать HTTP-заголовок SOAPAction: "http://www.bla.com:MyAction"

, но вам также необходимо указать также в SOAP-конверте заголовок: проверьте эти ссылки на наличие ссылки: SOAP ACTION

1 голос
/ 22 декабря 2011

Вы передаете его как SoapHeader, но на самом деле это заголовок HTTP.

Я нашел способ сделать это: http://lt.php.net/manual/en/soapclient.dorequest.php, установив параметр $ action.

Возможно, вам потребуется расширить класс SoapClient, чтобы сделать это с использованием меньшего количества строк кода.

...