![](/img/trans.png)
[英]Sending a Soap Header with a WSDL Soap Request with PHP
[英]php soap server ignores header in wsdl mode
我有一個SOAP服務器Web服務和另一個服務器上的SOAP客戶端來測試我的Web服務。
在wsdl模式下,SOAP服務器將忽略標頭和標頭功能,因此將忽略客戶機認證詳細信息。 意味着客戶端不進行身份驗證。 SOAP服務器在https域上。
SOAP服務器和客戶端可以在非wsdl模式下完美運行。
有人可以告訴我我在做什么錯嗎?
這是我的SOAP客戶端:
$params = 'LHAFDS89';
ini_set('soap.wsdl_cache_enabled',0);
ini_set('soap.wsdl_cache',0);
ini_set('soap.wsdl_cache_ttl',0);
$client = new SoapClient('https://www.example.com/webservices/example.wsdl', array('trace'=>true));
$authentication['key'] = "n/KLASDF9ASDF9832JDAFJ234=";
$auth_key = $authentication['key'];
$auth_mode = 't';
$auth = new SOAPAuth($auth_key,$auth_mode);
$header[] = new SoapHeader("urn:www.example.com",'authenticateClient',$auth,0);
$client->__setSoapHeaders($header);
try
{
$result = $client->soapFunction($params);
}
catch (SoapFault $e)
{
echo "<script>alert('".$e->faultcode.'\n\n'.$e->faultstring."');</script>";
}
echo $result['message'];
class SOAPAuth
{
public $key;
public $mode;
public function __construct($key, $mode)
{
$this->key = $key;
$this->mode = $mode;
}
}
SOAP服務器:
class ExampleClass {
protected $user_is_valid;
protected $mode;
public function __construct()
{
$this->user_is_valid = false;
$this->mode = '';
}
public function authenticateClient($header){
if (isset($header->key) && isset($header->mode)){
$authentication['key'] = $header->key;
$this->mode = $header->mode;
if($authentication['key']== 'n/KLASDF9ASDF9832JDAFJ234=')
{
$this->user_is_valid = true;
}
}
}
public function soapFunction($params)
{
if($this->user_is_valid == true){
$result['message'] = "User is valid."
return $result;
} else {
throw new SoapFault("Authorization:", "Failed!");
}
}
}
ini_set('soap.wsdl_cache_enabled',0);
ini_set('soap.wsdl_cache',0);
ini_set('soap.wsdl_cache_ttl',0);
$example_class = new ExampleClass();
$server = new SoapServer("example.wsdl");
$server->setObject($example_class);
$server->handle();
WSDL:
<?xml version="1.0" encoding="utf-8"?>
<definitions name="Example"
targetNamespace="urn:Example"
xmlns:typens="urn:Example"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/"
xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
xmlns="http://schemas.xmlsoap.org/wsdl/">
<message name='header'>
<part name='key' type='xsd:string'/>
<part name='mode' type='xsd:string'/>
</message>
<message name='soapFunction_request'>
<part name='params' type='xsd:string'/>
</message>
<message name='soapFunction_response'>
<part name='result' type='xsd:string[]'/>
</message>
<portType name='soapFunctionPortType'>
<operation name='soapFunction'>
<input message='tns:soapFunction_request'/>
<output message='tns:soapFunction_response'/>
</operation>
</portType>
<binding name='soapFunctionBinding' type='tns:soapFunctionPortType'>
<soap:binding style='rpc'
transport='http://schemas.xmlsoap.org/soap/http'/>
<operation name='soapFunction'>
<soap:operation soapAction='urn:soapFunction'/>
<input>
<soap:header message="header" part="key"/>
<soap:header message="header" part="mode"/>
<soap:body use='encoded' namespace='urn:soapFunction'
encodingStyle='http://schemas.xmlsoap.org/soap/encoding/'/>
</input>
<output>
<soap:body use='encoded' namespace='urn:soapFunction'
encodingStyle='http://schemas.xmlsoap.org/soap/encoding/'/>
</output>
</operation>
</binding>
<service name='soapFunctionService'>
<port name='soapFunctionServicePort' binding='soapFunctionBinding'>
<soap:address location='https://www.example.com/webservices/soapServer.php'/>
</port>
</service>
</definitions>
任何幫助,將不勝感激。
我找到了解決問題的方法。 這並不是我的初衷,但確實有效。
我讓SOAP客戶端以wsdl模式連接到我的SOAP服務器,讓SOAP服務器以非wsdl模式進行響應。
由於某些原因,在以這種方式工作時標頭不會被忽略,客戶端將正確進行身份驗證,並且將根據wsdl檢查客戶端輸入的有效性。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.