创建您自己的 xml 命名空间
Creating your own xml namespace
我已经按照 https://spring.io/guides/gs/producing-web-service/ 上的教程创建了一个应用程序,该应用程序将接收 SOAP 请求并且应该 return 一些 SOAP 响应。但是,教程中的命名空间只是一个示例。如何创建自己的名称空间(URI、前缀、内容...)?我一直在寻找,但没有成功...提前致谢!
正如我在上面的评论中提到的,您应该阅读此 post 以了解什么是 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
(我得到了随机的 UUID from here)。
所以基本上,您只需发明一个相当独特的,然后将其替换到您所关注的示例的代码中。
至于在该命名空间中定义元素,您将需要 XML schema where you define your elements, sub-elements, attributes, their types, etc. Look in the tutorial you are following and you will see there is a section on XML schema:
<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
或您选择的任何内容)并在其中声明您的元素。
你将有一些阅读要做:)祝你好运!
我已经按照 https://spring.io/guides/gs/producing-web-service/ 上的教程创建了一个应用程序,该应用程序将接收 SOAP 请求并且应该 return 一些 SOAP 响应。但是,教程中的命名空间只是一个示例。如何创建自己的名称空间(URI、前缀、内容...)?我一直在寻找,但没有成功...提前致谢!
正如我在上面的评论中提到的,您应该阅读此 post 以了解什么是 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
(我得到了随机的 UUID from here)。
所以基本上,您只需发明一个相当独特的,然后将其替换到您所关注的示例的代码中。
至于在该命名空间中定义元素,您将需要 XML schema where you define your elements, sub-elements, attributes, their types, etc. Look in the tutorial you are following and you will see there is a section on XML schema:
<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
或您选择的任何内容)并在其中声明您的元素。
你将有一些阅读要做:)祝你好运!