WSDL 中的 targetNamespace 和命名空间

Posted

技术标签:

【中文标题】WSDL 中的 targetNamespace 和命名空间【英文标题】:targetNamespace and namespace in WSDL 【发布时间】:2015-03-16 11:44:59 【问题描述】:

我正在研究 SOAP Web 服务,我对 Web 服务非常陌生。在 WSDL 中,我对定义中的 targetNamespace 元素和 xsd:schema 中包含的 namespace 有点困惑。

<definitions .... targetNamespace=" " >

<xsd:schema>
<xsd:import namespace=" " schemaLocation=""/>
</xsd:schema>

这两个元素是什么意思,我在网上搜索了很多文章,我无法清楚地确定这一点。谁能给我解释一下?

这两个值是否相同?

【问题讨论】:

【参考方案1】:

WSDL 文件中的目标名称空间将是与 SOAP 服务本身关联的名称空间。例如,我们有一个客户服务,命名空间类似于http://www.acme.com/Customer/V1/CustomerService

XSD 导入部分是您指定要导入的 XSD 的命名空间的地方。 XSD 文件将包含服务将发送的数据,即它包含将被序列化为 XML 并作为请求和响应上下发送的对象定义。 XSD 还可以包含 WSDL 将公开的操作。

一个 WSDL 可以导入一个或多个 XSD 文件,每个 XSD 都有自己的命名空间。 XSD 将包含一个命名空间,例如:

    http://www.acme.com/Customer/V1/GetCustomerRequest 用于 GetCustomerRequest,这将定义 GetCustomerRequest 操作的数据结构。 http://www.acme.com/Customer/V1/CustomerObject 对于 CustomerObject,这将定义 CustomerObject 的数据结构。

命名空间有点像 Java 包,它们只是允许您定义对象的层次结构。要理解的一件重要事情是,您可能有两个 Customer 对象,一个属于您的销售系统,另一个属于您的 CRM 系统。通过将它们放置在单独的命名空间中,您将能够在同一服务中使用这两个 Customer 对象,只要它们具有唯一的命名空间。

通常,这些命名空间也将构成 SOA 目录的一部分,并且定义它们将成为您的 SOA 治理标准的一部分。如果您想成功地进行 SOA,它们很重要。

【讨论】:

你在吗?我有一个疑问。公司给了我一个带有 2 个 targetNameSpaces 的 WSDL。我应该使用哪一个来创建 QName? 分配给 namespace 的 URI 是否必须是网络上可见的有效 URI? @amphibient 它必须是语法上的有效 URL。它不需要在网络上可见。【参考方案2】:

我将使用 Java 类比来解释。

命名空间就像 Java 包。每个 xml 元素都在一个命名空间中。提供 targetNamespace 意味着其中定义的所有元素(和类型)都在该命名空间中。类似于所有 Java 类都在包中。

被导入的 xsd 将有自己的目标命名空间,这意味着 xsd 中的所有元素都将位于定义的命名空间中。

wsdl 中的导入就像提供指定包的 java 导入一样。

我希望我是清楚的和有帮助的:D。

【讨论】:

【参考方案3】:

targetNamespace 类似于 java 中的 包声明,用于创建模式 命名空间类似于java中的package import,这通常用于在另一个schema中重用一个schema。

targetNamespace 是一个 XML Schema “工件”。当我们与不同的团队合作时,用户定义的数据类型可能会出现名称冲突。 schema 元素的这个属性定义了命名空间,即包。按照惯例,我们使用 URI/URL,但我们可以使用任何字符串..

<?xml version="1.0" ?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
                      targetNamespace="namespace">
        ...
</xs:schema>

例如:

xsi:schemaLocation="http://www.springframework.org/schema/mvc http://www.springframework.org/schema/beans/spring-mvc.xsd" xmlns:mvc="http://www.springframework.org/schema/mvc"
  //  or if the schema  exist in current directory we can declare as follows
xsi:schemaLocation="http://www.springframework.org/schema/mvc spring-mvc.xsd" xmlns:mvc="http://www.springframework.org/schema/mvc"
 //for import xml schema
<xsd:import schemaLocation="http://localhost:9999/ws/hello?xsd=1" namespace="http://ws.peter.com/"/>

注意: xsi:schemaLocation 表示命名空间和 URL 用空格分隔。而xmlns:mvc 表示命名空间http://www.springframework.org/schema/mvc 定义为mvc 别名。

命名空间类比:

+---------+--------------------------------------------------------+------------------------------+------------------------+
| Context |                          Name                          |     Namespace identifier     |       Local name       |
+---------+--------------------------------------------------------+------------------------------+------------------------+
| Path    | /home/user/readme.txt                                  | /home/user (path)            | readme.txt (file name) |
| XML     | xmlns:xhtml="http://www.w3.org/1999/xhtml"<xhtml:body> | http://www.w3.org/1999/xhtml | body                   |
| Java    | java.util.Date                                         | java.util                    | Date                   |
+---------+--------------------------------------------------------+------------------------------+------------------------+ 

for more details

【讨论】:

太棒了!感谢您对命名空间的澄清。所以,我将把 *WSDL 和所有 *.XSD 文件放到 php 脚本的当前工作目录中。希望 SoapClient 会通过这些本地名称找到它们;)

以上是关于WSDL 中的 targetNamespace 和命名空间的主要内容,如果未能解决你的问题,请参考以下文章

Intellij的WSDL客户端生成代码

出现在 Web 服务架构中的 tns

Apache cxf Web服务中的WebServiceContext为null

Androd中的soap协议

Androd中的soap协议

如何避免在CXF或JAX-WS生成的Web服务客户端中指定WSDL位置?