【问题标题】:Creating your own xml namespace创建自己的 xml 命名空间
【发布时间】:2021-06-16 08:05:51
【问题描述】:

我按照https://spring.io/guides/gs/producing-web-service/ 上的教程创建了一个将接收 SOAP 请求并应返回一些 SOAP 响应的应用程序。但是,本教程中的命名空间只是一个示例。如何创建自己的命名空间(URI、前缀、内容...)?我一直在搜索,但没有成功...提前致谢!

【问题讨论】:

标签: spring spring-boot web-services soap namespaces


【解决方案1】:

正如我在上面的评论中提到的,您应该阅读这篇文章以了解 XML 命名空间是什么:What are XML namespaces for?

在您的问题的上下文中,它的要点是它提供了有关 XML 中元素的一些上下文。例如,如果您的服务遇到<table> 元素,那么服务器如何知道这是什么<table>

是这个吗?

是这个吗?

还是这个?

命名空间允许您通过添加命名空间来区分它们:

<table xmlns="urn:tabular-data:tables">
<table xmlns="urn:chemistry:periodic-table">
<table xmlns="urn:products:furniture:kitchen-table">

您可能还想查看this question 看看我在这里做了什么,但简而言之,我只是编造了这些。我当场发明了它们。

在您的示例中,您也可以这样做。

问题在于 SOAP 消息是由不同元素组成的 XML。有些属于 SOAP 本身,有些属于您的应用程序,有些属于其他 web service specifications,等等,您的服务需要理解它们。这就是您使用名称空间的原因,以便为元素添加意义。例如,在该页面上,您有以下请求:

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"
                  xmlns:gs="http://spring.io/guides/gs-producing-web-service">
   <soapenv:Header/>
   <soapenv:Body>
      <gs:getCountryRequest>
         <gs:name>Spain</gs:name>
      </gs:getCountryRequest>
   </soapenv:Body>
</soapenv:Envelope>

当您说它是信封时,您并不是指任何信封,而是指 SOAP 信封。您知道它是一个 SOAP 信封,因为它的命名空间是 http://schemas.xmlsoap.org/soap/envelope/。 SOAP 负载本身具有来自命名空间 http://spring.io/guides/gs-producing-web-service 的元素。

两者都是发明的,唯一的区别是http://schemas.xmlsoap.org/soap/envelope/在发明之后被标准化在一个文档中,以便每个人都知道它的含义。你不需要标准化你的(http://spring.io/guides/gs-producing-web-service 也不是),你只需要发明一个独特的和特定于你的上下文。

人们通常使用他们拥有的域命名空间,甚至可能会在其中添加一些时间戳。因此,如果您认为这是您独有的,您可以使用例如 http://jovana-vajagic.com/2021/03/20/example-service。或者,如果您愿意,也可以使用 urn:uuid:8f4ac50e-574b-4936-b49b-8b129bea945b(我从 here 得到了随机的 UUID)。

所以基本上,您只需发明一个相当独特的,然后在您所遵循的示例的代码中替换它。

至于在该命名空间中定义元素,您将需要一个 XML schema 在其中定义您的元素、子元素、属性、它们的类型等。查看您正在遵循的教程,您将看到 @987654330 @:

<xs:schema 
  xmlns:xs="http://www.w3.org/2001/XMLSchema" 
  xmlns:tns="http://spring.io/guides/gs-producing-web-service"
  targetNamespace="http://spring.io/guides/gs-producing-web-service" 
  elementFormDefault="qualified">
    ...

您需要创建类似的东西,使用您的命名空间(如 http://jovana-vajagic.com/2021/03/20/example-service 或您选择的任何内容)并在其中声明您的元素。

你将有一些阅读要做:) 祝你好运!

【讨论】:

  • 嗨,是的,我确实查看了您发送给我的链接,总的来说我很清楚这个想法,但出于某种原因,我确信我需要将该命名空间部署在某个地方并使用有效的现有 URL。我不知道我可以发明一些东西并合法地使用它。 :) 非常感谢您详细而清晰的解释。
猜你喜欢
  • 2014-03-23
  • 1970-01-01
  • 1970-01-01
  • 2015-09-05
  • 1970-01-01
  • 2016-08-29
  • 2011-03-17
  • 2016-01-01
  • 1970-01-01
相关资源
最近更新 更多