我正在尝试创建适当的基于wsdl的soap请求,但没有成功,这里是我需要的示例: 的 soap.xml:
<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Header>
<AuthMember xmlns="http://tempuri.org/">
<somefield>string</somefield>
</AuthMember>
</soap:Header>
<soap:Body>
<AuthenticateMember xmlns="http://tempuri.org/" />
</soap:Body>
</soap:Envelope>
我的结果是: 的 soap.xml:
<?xml version="1.0" encoding="UTF-8"?>
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns1="http://tempuri.org/" xmlns:ns2="http://schemas.xmlsoap.org/ws/2002/07/utility">
<SOAP-ENV:Header>
<ns2:AuthMember>
<somefield>somefieldvalue</somefield>
</ns2:AuthMember>
</SOAP-ENV:Header>
<SOAP-ENV:Body>
<ns1:AuthenticateMember/>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>
这是我的PHP代码:
class SoapHeaderAuthMember
{
public $somefield;
public function __construct($somefield)
{
$this->somefield = $somefield;
}
}
$client = new SoapClient( 'https://www.somepage.com/service.asmx?WSDL',
array("exceptions"=>0, "trace" => 1 )
);
$authMember = new SoapHeaderAuthMember('somefieldvalue');
$soapHeaders[] = new SoapHeader('http://schemas.xmlsoap.org/ws/2002/07/utility', 'AuthMember', $authMember);
$client->__setSoapHeaders($soapHeaders);
$client->__soapCall('AuthenticateMember',array());
看,
1.it生成SOAP-ENV:Envelope而不是SOAP-ENV:Envelope
2.in header:我有ns2:AuthMember而不是AuthMember
3.在体内我有ns1:AuthenticateMember而不是AuthenticateMember xmlns =“http://tempuri.org/”
如何获得正确的xml?我查看了php函数手册并找不到答案,谷歌搜索没有给我成功的结果。
你能帮忙吗?
答案 0 :(得分:1)
已生成的结果是代码中已请求的结果,但对命名空间的某些属性的解释依次为:
XML文档中的每个标记都有一个完全限定的表单,该表单由命名空间和标记名称定义(即使它位于'default'命名空间中,没有显式的命名空间声明)。完全限定版本通常写为 {namespace} tag 。通过解析完全限定名称,可以确定两个元素的表示是否相同。
命名空间以多种方式与元素相关联,包括使用元素
显式命名空间Example:
<AuthMember xmlns="http://tempuri.org/">
resolving to fully-qualified name {http://tempuri.org/}AuthMember
并通过名称空间关联的前缀
Example:
<... xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Header>
resolving to {http://schemas.xmlsoap.org/soap/envelope/}Header
前缀在声明前缀的元素和任何包含的元素的范围内。使用的实际前缀并不重要( soap , SOAP-ENV 或 randomprefix 可用于 http:// schemas。 xmlsoap.org/soap/envelope / 名称空间),虽然好的做法是使用有意义的东西。
鉴于此,“所需”和“实际”文档中的完全限定元素几乎相同,异常是标题元素AuthMember。在您想要的内容中,您可以为完全限定的 {http://tempuri.org/} AuthMember 指明 http://tempuri.org/ 的命名空间。实际上,前缀关联会产生完全限定的 {http://schemas.xmlsoap.org/ws/2002/07/utility} AuthMember 。
这是SoapHeader实例化的结果,为AuthMember指定了...实用程序命名空间。在代码中更改该语句以使用 http://tempuri.org/ 命名空间应该会使实际文档与所需文档匹配。