php - SoapServer - 需要在 Soap 响应中添加命名空间
php - SoapServer - Need add a namespace in Soap response
我需要在 Soap 响应中添加命名空间。我正在使用 php 和 SoapServer。我的回复是这样开头的:
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:ns1="urn:query:request:v2.0">
我需要这样开始:
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:ns1="urn:query:request:v2.0" xmlns:ns2="urn:query:type:v2.0">
我在PHP的代码是这样的,不知如何继续:
class Service
{
// FUNCTIONS
}
$options= array('uri'=>'urn:query:request:v2.0',
'cache_wsdl' => WSDL_CACHE_NONE);
$server=new SoapServer("Service.wsdl",$options);
$server->setClass('Service');
$server->addFunction(SOAP_FUNCTIONS_ALL);
$server->handle();
谢谢
命名空间动态添加到 soap 响应主体。只要 soap 主体中没有具有所需命名空间的元素,它就不会出现。您必须在响应中声明它。这是一个简单的例子。
肥皂请求处理Class
在这个 class 中通常定义了 soap 服务的功能。这里发生了魔法。您可以使用所需的名称空间初始化 SoapVar 对象。
class Response
{
function getSomething()
{
$oResponse = new StdClass();
$oResponse->bla = 'blubb';
$oResponse->yadda = 'fubar';
$oEncoded = new SoapVar(
$oResponse,
SOAP_ENC_OBJECT,
null,
null,
'response',
'urn:query:type:v2.0'
);
return $oEncoded;
}
}
使用 PHP 自己的 SoapVar class 您可以将名称空间添加到节点。第五个参数是节点的名称,第六个参数是节点所属的命名空间。
Soap 服务器
$oServer = new SoapServer(
'/path/to/your.wsdl',
[
'encoding' => 'UTF-8',
'send_errors' => true,
'soap_version' => SOAP_1_2,
]
);
$oResponse = new Response();
$oServer->setObject($oResponse);
$oServer->handle();
如果调用服务函数 getSomething
,响应将如下所示 xml。
<?xml version="1.0" encoding="UTF-8"?>
<env:Envelope xmlns:env="http://www.w3.org/2003/05/soap-envelope" xmlns:ns1="urn:query:type:v2.0">
<env:Body>
<ns1:Response>
<ns1:bla>blubb</ns1:yadda>
<ns1:blubb>fubar</ns1:blubb>
</ns1:Response>
</env:Body>
</env:Envelope>
如您所见,我们提供给 SoapVar 对象的名称空间出现在 soap 响应的信封节点中。
我需要在 Soap 响应中添加命名空间。我正在使用 php 和 SoapServer。我的回复是这样开头的:
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:ns1="urn:query:request:v2.0">
我需要这样开始:
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:ns1="urn:query:request:v2.0" xmlns:ns2="urn:query:type:v2.0">
我在PHP的代码是这样的,不知如何继续:
class Service
{
// FUNCTIONS
}
$options= array('uri'=>'urn:query:request:v2.0',
'cache_wsdl' => WSDL_CACHE_NONE);
$server=new SoapServer("Service.wsdl",$options);
$server->setClass('Service');
$server->addFunction(SOAP_FUNCTIONS_ALL);
$server->handle();
谢谢
命名空间动态添加到 soap 响应主体。只要 soap 主体中没有具有所需命名空间的元素,它就不会出现。您必须在响应中声明它。这是一个简单的例子。
肥皂请求处理Class
在这个 class 中通常定义了 soap 服务的功能。这里发生了魔法。您可以使用所需的名称空间初始化 SoapVar 对象。
class Response
{
function getSomething()
{
$oResponse = new StdClass();
$oResponse->bla = 'blubb';
$oResponse->yadda = 'fubar';
$oEncoded = new SoapVar(
$oResponse,
SOAP_ENC_OBJECT,
null,
null,
'response',
'urn:query:type:v2.0'
);
return $oEncoded;
}
}
使用 PHP 自己的 SoapVar class 您可以将名称空间添加到节点。第五个参数是节点的名称,第六个参数是节点所属的命名空间。
Soap 服务器
$oServer = new SoapServer(
'/path/to/your.wsdl',
[
'encoding' => 'UTF-8',
'send_errors' => true,
'soap_version' => SOAP_1_2,
]
);
$oResponse = new Response();
$oServer->setObject($oResponse);
$oServer->handle();
如果调用服务函数 getSomething
,响应将如下所示 xml。
<?xml version="1.0" encoding="UTF-8"?>
<env:Envelope xmlns:env="http://www.w3.org/2003/05/soap-envelope" xmlns:ns1="urn:query:type:v2.0">
<env:Body>
<ns1:Response>
<ns1:bla>blubb</ns1:yadda>
<ns1:blubb>fubar</ns1:blubb>
</ns1:Response>
</env:Body>
</env:Envelope>
如您所见,我们提供给 SoapVar 对象的名称空间出现在 soap 响应的信封节点中。