没有 WSDL 的 SOAP 客户端
SOAP clients without a WSDL
我正在尝试使用标准业务报告 (SBR)。它使用 SOAP 和 ebXML(ebms3)。
他们以这个 xml 为例
<?xml version="1.0" encoding="utf-8"?>
<soapenv:Envelope xmlns:soapenv="http://www.w3.org/2003/05/soap-envelope">
<soapenv:Header>
<eb:Messaging xmlns:eb="http://docs.oasis-open.org/ebxml-msg/ebms/v3.0/ns/core/200704/" xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd" soapenv:mustUnderstand="true" wsu:Id="soapheader-1">
<ns2:UserMessage xmlns:ns2="http://docs.oasis-open.org/ebxml-msg/ebms/v3.0/ns/core/200704/">
<ns2:MessageInfo>
<ns2:Timestamp>2018-01-07T23:01:31.592Z</ns2:Timestamp>
<ns2:MessageId>A1515366089895.d1b7047b-2e8e-4fa1-81f0-c3eec198bddb@1515366089897</ns2:MessageId>
</ns2:MessageInfo>
<ns2:PartyInfo>
<ns2:From>
<ns2:PartyId type="http://abr.gov.au/PartyIdType/ABN">67094544519</ns2:PartyId>
<ns2:Role>http://sbr.gov.au/ato/Role/Business</ns2:Role>
</ns2:From>
<ns2:To>
<ns2:PartyId type="http://abr.gov.au/PartyIdType/ABN">51824753556</ns2:PartyId>
<ns2:Role>http://sbr.gov.au/agency</ns2:Role>
</ns2:To>
</ns2:PartyInfo>
</ns2:UserMessage>
</eb:Messaging>
…
</soapenv:Header>
<soapenv:Body xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd" wsu:Id="soapbody"></soapenv:Body>
</soapenv:Envelope>
我的理解是,许多 SOAP 库采用 WSDL 来创建可以调用所列服务的客户端。但是我没能找到它的 WDSL。
SOAP api 是否需要 WDSL?没有一个你能进步吗?
建议使用 WSDL 生成客户端代码,这通常是调用 SOAP 服务的方式。
但是,可以在根本不访问 WSDL 的情况下调用 SOAP 服务。如果您使用的技术栈不支持处理 WSDL 文件,这可能是必要的。您可以简单地使用 curl 来访问某些 SOAP 服务。尽管我要强调,如果不从 WSDL 生成客户端代码,使用更复杂的 SOAP API 会很棘手。
使用 curl 调用 SOAP 服务的示例:
创建文件 getcities.xml,内容如下:
getcities.xml
<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Body>
<GetCitiesByCountry xmlns="http://www.webserviceX.NET">
<CountryName>France</CountryName>
</GetCitiesByCountry>
</soap:Body>
</soap:Envelope>
然后像这样调用 curl:
curl -v -X POST --data @getcities.xml -H "Content-Type: text/xml; charset=utf-8" -H "SOAPAction: http://www.webserviceX.NET/GetCitiesByCountry" http://www.webservicex.net/globalweather.asmx
SOAP 调用实际上只是带有 XML 正文的 HTTP POST 请求(在几乎所有情况下)。
哦,按照惯例,WSDL 在 SOAP 服务 URL 中可用,参数为 WSDL,例如
https://somesoapprovider.net/soapservice?WSDL.
例如
http://www.webservicex.net/globalweather.asmx?WSDL
请注意,ebMS3/AS4基于 SOAP 并使用其处理模型和结构,但它是自己的消息传递协议规范。尽管 ebMS3/AS4 规范也使用 WS-Security,但它不是一个普通的 Web 服务,因为有额外的处理要求。例如关于使用 ebMS 收据消息实现可靠的消息传递。
因此,通常使用软件供应商的实现来在您的解决方案中实现 ebMS3/AS4 消息传递。有许多可用的实现,包括受支持的 open-source。但是,对于澳大利亚 SBR,您应该注意有时会包含对 AS4 规范的扩展,这要求您在消息的 WS-Security header 中包含 SAML 令牌。并不总是支持此扩展程序。
我正在尝试使用标准业务报告 (SBR)。它使用 SOAP 和 ebXML(ebms3)。
他们以这个 xml 为例
<?xml version="1.0" encoding="utf-8"?>
<soapenv:Envelope xmlns:soapenv="http://www.w3.org/2003/05/soap-envelope">
<soapenv:Header>
<eb:Messaging xmlns:eb="http://docs.oasis-open.org/ebxml-msg/ebms/v3.0/ns/core/200704/" xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd" soapenv:mustUnderstand="true" wsu:Id="soapheader-1">
<ns2:UserMessage xmlns:ns2="http://docs.oasis-open.org/ebxml-msg/ebms/v3.0/ns/core/200704/">
<ns2:MessageInfo>
<ns2:Timestamp>2018-01-07T23:01:31.592Z</ns2:Timestamp>
<ns2:MessageId>A1515366089895.d1b7047b-2e8e-4fa1-81f0-c3eec198bddb@1515366089897</ns2:MessageId>
</ns2:MessageInfo>
<ns2:PartyInfo>
<ns2:From>
<ns2:PartyId type="http://abr.gov.au/PartyIdType/ABN">67094544519</ns2:PartyId>
<ns2:Role>http://sbr.gov.au/ato/Role/Business</ns2:Role>
</ns2:From>
<ns2:To>
<ns2:PartyId type="http://abr.gov.au/PartyIdType/ABN">51824753556</ns2:PartyId>
<ns2:Role>http://sbr.gov.au/agency</ns2:Role>
</ns2:To>
</ns2:PartyInfo>
</ns2:UserMessage>
</eb:Messaging>
…
</soapenv:Header>
<soapenv:Body xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd" wsu:Id="soapbody"></soapenv:Body>
</soapenv:Envelope>
我的理解是,许多 SOAP 库采用 WSDL 来创建可以调用所列服务的客户端。但是我没能找到它的 WDSL。
SOAP api 是否需要 WDSL?没有一个你能进步吗?
建议使用 WSDL 生成客户端代码,这通常是调用 SOAP 服务的方式。
但是,可以在根本不访问 WSDL 的情况下调用 SOAP 服务。如果您使用的技术栈不支持处理 WSDL 文件,这可能是必要的。您可以简单地使用 curl 来访问某些 SOAP 服务。尽管我要强调,如果不从 WSDL 生成客户端代码,使用更复杂的 SOAP API 会很棘手。
使用 curl 调用 SOAP 服务的示例:
创建文件 getcities.xml,内容如下:
getcities.xml
<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Body>
<GetCitiesByCountry xmlns="http://www.webserviceX.NET">
<CountryName>France</CountryName>
</GetCitiesByCountry>
</soap:Body>
</soap:Envelope>
然后像这样调用 curl:
curl -v -X POST --data @getcities.xml -H "Content-Type: text/xml; charset=utf-8" -H "SOAPAction: http://www.webserviceX.NET/GetCitiesByCountry" http://www.webservicex.net/globalweather.asmx
SOAP 调用实际上只是带有 XML 正文的 HTTP POST 请求(在几乎所有情况下)。
哦,按照惯例,WSDL 在 SOAP 服务 URL 中可用,参数为 WSDL,例如
https://somesoapprovider.net/soapservice?WSDL.
例如
http://www.webservicex.net/globalweather.asmx?WSDL
请注意,ebMS3/AS4基于 SOAP 并使用其处理模型和结构,但它是自己的消息传递协议规范。尽管 ebMS3/AS4 规范也使用 WS-Security,但它不是一个普通的 Web 服务,因为有额外的处理要求。例如关于使用 ebMS 收据消息实现可靠的消息传递。
因此,通常使用软件供应商的实现来在您的解决方案中实现 ebMS3/AS4 消息传递。有许多可用的实现,包括受支持的 open-source。但是,对于澳大利亚 SBR,您应该注意有时会包含对 AS4 规范的扩展,这要求您在消息的 WS-Security header 中包含 SAML 令牌。并不总是支持此扩展程序。