好的,所以我正在学习SOAP。 Here是一个SOAP请求和一个SOAP响应,以及WSDL。
为什么我们需要WSDL文件?为什么我们需要portType
,例如
<wsdl:portType name="GetEndorsingBoarderPortType">
<wsdl:operation name="GetEndorsingBoarder">
<wsdl:input message="es:GetEndorsingBoarderRequest"/>
<wsdl:output message="es:GetEndorsingBoarderResponse"/>
<wsdl:fault message="es:GetEndorsingBoarderFault"/>
</wsdl:operation>
</wsdl:portType>
服务器无法通过解析SOAP请求来确定使用哪个方法以及发送only
的响应?
为什么该示例在信封中使用命名空间xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"
?它不能只发送带有所需标签的简单XML,解析它并发送答案吗?
答案 0 :(得分:2)
很多问题,我猜你出于好奇而问我所以我试图“只是”自上而下地回答它们,希望有一些提示可以帮助你进一步定位:
实际上它确实如此。从客户端角度来看,WSDL仅用于告诉您服务是什么(服务的解密)以及 - 如果是PHP SoapClient - 以帮助您访问服务(使用只有含有一粒盐,在WSDL模式下使用 SoapClient 通常是推荐使用它的方法。)服务器无法通过解析SOAP请求来确定使用哪个方法以及要发送哪个响应?
为什么我们需要WSDL文件?
它包含机器可读格式的服务描述。如果您需要了解该服务,则需要它。如果您知道服务中的服务,则不需要它,只需将您需要的每个请求组合在一起(如果服务处理多个操作和复杂类型,则不推荐)。
为什么我们需要
portType
[...?]
portType ,这是一组抽象操作。每个操作都引用一条输入消息和输出消息。
这是定义服务的六大要素之一。这里有关于端口类型的更多细节:http://www.w3.org/TR/wsdl#_porttypes - 取决于服务,这些可能不同,并且有没有PortTypes的服务以及IIRC(可能仅在早期的SOAP版本中,不能肯定地从我的头脑中说出来) )。
为什么该示例在信封中使用命名空间
xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"
?它不能只发送带有所需标签的简单XML,解析它并发送答案吗?
那就是“只是”发送XML。这些元素遵循XML命名空间的命名,这就是全部。所以要逐字回答这个问题:不,它不能只发送简单的(非命名空间的)XML,因为它需要知道命名空间中的标记来识别它们。
这样做是为了将SOAP信封与XML编码的消息体中的其他信息分开。想象一下,服务消息也会与信封,消息或标题进行交易。名称的冲突很有可能,因此名称空间对于SOAP消息的包络和作为从服务发送或检索的对象的信封之间的区别很重要。