我正在尝试在.Net应用程序中使用新引入的Magento 2.0 SOAP API。但根据新构造的端点 wsdl 的变化,函数调用执行与早期版本略有不同..
有人在.Net应用程序中亲自使用和调用Magento 2.0的Web API Soap对象函数吗?
如果可以,您可以提供一些相同的代码片段吗?
提前致谢!
我终于让 Magento 2 SOAP API 和 .NET 能够相互对话。这是对我有用的分步:
系统 > 集成 > 添加新集成
仅在此处填写姓名和电子邮件,因为我们只想发回我们自己的商店并让 Magento 为您保存令牌和密钥。不要忘记在单独的选项卡上设置集成权限。
注意:如果您使用的是虚拟机,请确保您的 /etc/hosts 文件具有其自身的条目,因为 Web 服务器将回发给其自身。
您应该在响应中显示访问令牌。记下来供以后使用。
在项目解决方案资源管理器中,右键单击“引用”并选择“添加服务引用” 地址类似于:
其中 services= 后面是您将使用的服务的逗号分隔列表。
要查看所有可用的服务,请访问您商店中的以下网址:
http://MyMagentoStore.com/soap/default?wsdl_list=1
我不建议选择所有这些,因为这会使 SOAP 调用 URL 变得非常长。我最终将服务分组为目录产品、客户等部分,并为每组创建单独的服务引用。
构建您的 URL 并将其粘贴到“添加服务引用”对话框中,然后单击“开始”。
如果您确实像我一样选择将服务分开,只需为每个服务提供一个好的命名空间即可。我选择了 Magento2Soap.Customer、Magento2Soap.CatalogProduct 等。无论如何,请在对话框底部选择一个命名空间,然后单击“确定”。这将生成连接到 Magento 的代码。
现在最难弄清楚的部分是:真正让它发挥作用。
您必须使用 WCF 库在 SOAP 调用中添加正确的授权标头。这样做并不明显。这是一个片段:
var client = new customerCustomerRepositoryV1PortTypeClient();
client.Endpoint.Binding = new BasicHttpBinding();
HttpRequestMessageProperty hrmp = new HttpRequestMessageProperty();
hrmp.Headers.Add("Authorization", "Bearer " + yourAccessToken);
OperationContextScope contextScope = new OperationContextScope(client.InnerChannel);
OperationContext.Current.OutgoingMessageProperties[HttpRequestMessageProperty.Name] = hrmp;
CustomerCustomerRepositoryV1GetByIdResponse response = client.customerCustomerRepositoryV1GetById(
new CustomerCustomerRepositoryV1GetByIdRequest() {
customerId = 1
}
);
Console.WriteLine(response.result.firstname);
请注意,您需要添加对 System.ServiceModel 的项目引用。您可以通过右键单击“解决方案资源管理器”中的“引用”,然后单击“添加引用”来完成此操作。它将出现在核心库列表中。
我从未找到为每种不同类型的调用使用多态性的好方法,因为生成的类不继承自任何公共类或接口,并且我不打算接近动态类型。我最终创建了一个静态类来简化事情:
public static class MagentoSOAP {
private static BasicHttpBinding GetBinding() {
return new BasicHttpBinding();
}
private static void AddAuthorizationHeader(IClientChannel clientChannel) {
HttpRequestMessageProperty hrmp = new HttpRequestMessageProperty();
hrmp.Headers.Add("Authorization", "Bearer " + Constants.MAGENTO_SOAP_ACCESS_TOKEN);
OperationContextScope contextScope = new OperationContextScope(clientChannel);
OperationContext.Current.OutgoingMessageProperties[HttpRequestMessageProperty.Name] = hrmp;
}
public static customerCustomerRepositoryV1PortTypeClient Customer {
get {
var client = new customerCustomerRepositoryV1PortTypeClient();
client.Endpoint.Binding = GetBinding();
AddAuthorizationHeader(client.InnerChannel);
return client;
}
}
public static catalogProductRepositoryV1PortTypeClient Product {
get {
var client = new catalogProductRepositoryV1PortTypeClient();
client.Endpoint.Binding = GetBinding();
AddAuthorizationHeader(client.InnerChannel);
return client;
}
}
}
在实践中:
var product = MagentoSOAP.Product.catalogProductRepositoryV1Get(new Magento2SOAP.CatalogProduct.CatalogProductRepositoryV1GetRequest() {
sku = "My Product SKU"
});
int id = product.result.id;
我希望这有帮助。我欢迎任何改进或建议。