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 和命名空间的主要内容,如果未能解决你的问题,请参考以下文章