我正在尝试将旧的NuSOAP端点复制到另一个使用PHP的本机SOAP库实现的端点。我正在通过在每个端点中返回相同的虚拟数组并比较每个端点返回的xml进行测试。
以下是旧版服务器给出的示例响应
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/" xmlns:tns="http://localhost/webservices-soap/servicios">
<SOAP-ENV:Body>
<ns1:LeerAtributosResponse xmlns:ns1="http://localhost/webservices-soap/servicios">
<return xsi:type="SOAP-ENC:Array" SOAP-ENC:arrayType="tns:ParamValue[2]">.
<item xsi:type="tns:ParamValue">
<parametro xsi:type="xsd:string">hola</parametro>
<valor xsi:type="SOAP-ENC:Array" SOAP-ENC:arrayType="xsd:string[3]">
<item xsi:type="xsd:string">5</item>
<item xsi:type="xsd:string">6</item>
<item xsi:type="xsd:string">7</item>
</valor>
</item>
<item xsi:type="tns:ParamValue">
<parametro xsi:type="xsd:string">chau</parametro>
<valor xsi:type="SOAP-ENC:Array" SOAP-ENC:arrayType="xsd:string[0]"/>
</item>
</return>
</ns1:LeerAtributosResponse>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>
这是新实现给出的响应:
<SOAP-ENV:Envelope SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns1="http://localhost:8000/soap/servicios" xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<SOAP-ENV:Body>
<ns1:LeerAtributosResponse>
<return SOAP-ENC:arrayType="ns1:ParamValue[2]" xsi:type="ns1:ArrayOfParamValue">
<item xsi:type="ns1:ParamValue">
<parametro xsi:type="xsd:string">hola</parametro>
<valor SOAP-ENC:arrayType="xsd:string[3]" xsi:type="ns1:ArrayOfString">
<item xsi:type="xsd:string">5</item>
<item xsi:type="xsd:string">6</item>
<item xsi:type="xsd:string">7</item>
</valor>
</item>
<item xsi:type="ns1:ParamValue">
<parametro xsi:type="xsd:string">chau</parametro>
<valor xsi:type="ns1:ArrayOfString"/>
</item>
</return>
</ns1:LeerAtributosResponse>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>
我发现响应之间存在以下差异:
这两个标签(“ ns1”和“ tns”)之间有什么区别? xml中的这种差异会使响应有所不同吗?
答案 0 :(得分:2)
您在这里看到的是“ XML命名空间”。简而言之:
http://schemas.xmlsoap.org/soap/envelope/
。xmlns:someprefix="http://example.com"
之类的属性声明,并在<someprefix:foo someprefix:bar="hello" />
之类的元素和属性名中使用xmlns="http://example.com"
声明,它定义了名称空间元素在没有前缀的情况下所处的位置。http://localhost/webservices-soap/servicios
或http://localhost:8000/soap/servicios
。命名空间应该确实是硬编码的,因此无论您在何处部署服务,名称空间都应该是相同的,但是对于测试而言,它并不重要。SOAP-ENV
的{{1}}或soap
或envelope
,但这些名称根本没有改变意思。在这种情况下,前缀http://schemas.xmlsoap.org/soap/envelope/
和tns
就是不同的SOAP库选择使用的前缀。作为一个简单的例子,这些XML片段的含义完全相同:
ns1
和:
<?xml version="1.0"?>
<abc:example xmlns:abc="http://example.com">
<abc:foo>42</abc:foo>
</abc:example>
甚至:
<?xml version="1.0"?>
<xyz:example xmlns:xyz="http://example.com">
<xyz:foo>42</xyz:foo>
</xyz:example>
但这意味着不同(记住前缀并不重要,只有URI):
<?xml version="1.0"?>
<abc:example xmlns:abc="http://example.com">
<xyz:foo xmlns:xyz="http://example.com">42</xyz:foo>
</abc:example>