java - V2 和 WSI Magento SOAP 接口(interface)有什么作用?

标签 java php .net magento soap

Magento 有一个“Webservices API”,可以通过 SOAP 和 RPC 访问。

这里的术语有点奇怪,因为 SOAP(或 RPC)API 本身只公开了 8 种方法。要访问 Magento API 中的方法,您可以调用 SOAP api 方法 call,然后传入一个字符串,指示您真正想要调用的方法(类似于 catalog_product.info)

多年来,Magento 团队引入了两个额外的 API 后端,SOAP V2 和 SOAP WSI。引入这些后端是为了“提高与 .NET 和 Java 的兼容性”

这到底是什么意思?从代码的角度来看,这些 API 更改了公开的 WSDL,并且在使用 PHP 的 SOAP 客户端时,整个 call 事情都消失了。您正在调用客户端本身的实际方法消失了

$client->call($session, 'catalog_product.info',...);

vs.

$client->catalogProductInfo($sessionId, ...

我一直不清楚这如何提高 .NET 或 Java 兼容性(因为我不熟悉那些工具链)。

这仅仅是代码生成的便利/文化问题,还是 .NET 和 Java 用户实际上不可能使用原始的 SOAP API?

最佳答案

总体上有哪些改进?

WSDL 描述的 SOAP 服务的构建 block 大致是:

  • 契约:由 wsdl:portType、wsdl:message 和 wsdl:type 指定,描述操作以及这些操作所依据的消息和类型。所以这说明:该服务可以做什么?

  • 绑定(bind):wsdl:binding 将 wsdl:portType 绑定(bind)到具体传输、文档样式、策略等。这说明:如何与服务对话?

  • 地址:wsdl:service 部分将 wsdl:binding 链接到具体的服务端点地址。这回答:服务在哪里?

上述几点或多或少是 Windows Communication Foundation (WCF) 的基本原则。

因此,magento 的第一个 RPC 方法只是对 SOAP 协议(protocol)的滥用。通过少数入口函数的 key 孔的每个请求都有另一个包装的 RPC 协议(protocol)作为消息有效负载。所以 SOAP 只是用作消息传输,就像 SOAP 使用例如。 HTTP-POST。为了保持契约(Contract)有效,它必须非常复杂(大量可能的消息)或非常通用(只是一个字符串)。如果每个方法/操作都有自己的声明,契约(Contract)就会变得容易得多。这就是 V2 API 的作用。

但为什么这对于 Java 或 C# 等静态类型语言也是一个很大的改进?

正如 macki 提到的,这些语言有工具(代理生成器等)和框架(如 WCF 或 JAX-WS)。它们根据上面提到的用于消息类型的契约(Contract)数据传输对象 (DTO) 和用于方法调用的代理生成(它们做的更多,但在这里并不重要)。正如您在 Magento Wiki on C# magento soap v2 api 中看到的那样实例化过滤器对象和 salesOrderList 代理方法。契约的很大一部分是基于方法及其参数的静态类型。如果您要使用 V1 锁孔方法,您必须自己构建消息以满足契约,采用更随意的数据结构,例如字符串、字符串数组或字符串字典。

所以当然可以使用感觉不对的静态类型语言的旧 API。每个消息类型都有一个类型和操作代理的静态类型签名要好得多。除了 V2 之外,还有更好的 SOAP 服务,无论您使用何种语言调用它们。

关于java - V2 和 WSI Magento SOAP 接口(interface)有什么作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8013845/

相关文章:

java - 更改 JTable 中行的背景颜色

php - SELECT id WHERE id 等于传递的值

javascript - 在 php 或 javascript 中使用复选框删除

c# - 一台机器上可以存在多个 CLR 版本吗?

c# - 使用 .NET SmtpClient 将 Bcc 添加到电子邮件发送?

java - 如何从 StreamingOutput 读取数据

java - 使用@PersistenceContext(type=PersistenceContextType.EXTENDED) 时避免一级缓存问题

Java - 循环遍历数据库记录的有效方法

php - 显示所有用户中答案选择的百分比

.net - .NET Compact Framework 中的集群大小