【问题标题】:Magento API SOAP v1 and VB.NETMagento API SOAP v1 和 VB.NET
【发布时间】:2012-12-26 12:08:06
【问题描述】:

我正在使用 VB.NET 通过 API SOAP v1 与 Magento 进行通信。在接到一个需要关联数组的电话之前,我让它工作得很好。我尝试过字典、哈希表、自定义类型等。我确实读过哈希表,但字典不可序列化。所以我尝试了自定义类型/对象/类。以下是我收到的错误:

The type XXXX was not expected. Use the Xmlinclude or SoapInclude attribute to specify types that are not known statically.

所以我已经阅读了很多关于上述错误的帖子,但我无法得到任何工作。该错误似乎至少表明如果我做对了,我正在尝试的事情是可能的,但也许情况并非如此。我对 SOAP 了解不多,但我可以看到这永远不会起作用,因为 Web 服务可能不知道如何处理该对象。

所以我的问题是是否可以将自定义对象发送到 Magento API。或者更广泛地说,是否有可能让 SOAP v1 与 VB.NET 一起工作。我知道 v2 是一个选项,但我对 v1 非常熟悉,并且已经在 VB.NET 中使用它而不是这种情况。

【问题讨论】:

  • v2 似乎有问题。我正在尝试更新库存商品,唯一通过的数据是数量。
  • 关于 v2 buggy 我应该至少使用 VB.NET 中的 WSDL 生成的类来添加。

标签: api magento soap


【解决方案1】:

这需要大量的挖掘,但我已经完成了所有工作。首先,我使用了 PHP SoapClient,并注意到它是如何在soap 请求中形成关联数组的。您可以跟踪请求和响应,非常方便。从那里我使用 WebRequest 对象在 VB.NET 中编写了我自己的肥皂客户端。在这样做时,我可以完全控制发送到 API 的 xml。

再次,我走这条路的原因是 V2 最终不适合我。由于某种原因,并非所有参数都进入 API。这和我对 V1 也很满意的事实。我已经编写了几个自定义 API。

我为简短而道歉,但其中有很多内容。可能我的大部分时间都在遇到多个死胡同。如果有人想要详细信息,请随时给我发电子邮件。

编辑:

这是我用来查看需要如何格式化请求的 php 代码:

$client = new SoapClient('http://www.site.com/index.php/api/soap/?wsdl',array('trace' => TRUE));
$session = $client->login('user','api-key');

echo $client->__getLastRequest() ."\n\n";
echo $client->__getLastRequestHeaders() ."\n\n";
echo $client->__getLastResponse() ."\n\n";
echo $client->__getLastResponseHeaders() ."\n\n";

$result = $client->call($session, 'cataloginventory_stock_item.list','393');

echo $client->__getLastRequest() ."\n\n";
echo $client->__getLastRequestHeaders() ."\n\n";

var_dump($result);
$client->endSession($session);

以下是如何使用 VB.NET 发送请求。您将需要使用上面的 php 作为指导来构建 XML/SOAP 主体。我为每个 API 调用创建了一个类,它输出所需的 XML。您将需要 System.Net、System.Xml 和 System.IO。我使用 getSoapHeader() 是因为请求中有一些常见的 XML。有关详细信息,请参阅下一个代码部分:

    Private Function makeSoapRequest(ByVal soapBody As String) As String

    Dim req As WebRequest = WebRequest.Create(_soap_url)
    Dim xml As String

    xml = getSoapHeader() & soapBody

    Dim buffer() As Byte = System.Text.Encoding.UTF8.GetBytes(xml)
    req.ContentType = "text/xml; charset=utf-8"
    req.Method = "POST"

    req.Headers.Add("SOAPAction", "urn:Mage_Api_Model_Server_HandlerAction")
    req.ContentLength = buffer.Length

    Dim st As System.IO.Stream = req.GetRequestStream

    st.Write(buffer, 0, buffer.Length)
    st.Close()

    Dim response As WebResponse

    Try
        response = req.GetResponse
    Catch ex As WebException
        response = ex.Response
    End Try

    st = response.GetResponseStream()

    Dim reader As New StreamReader(st)

    Dim responseFromServer As String = reader.ReadToEnd()

    makeSoapRequest = responseFromServer

    response.Close()
    st.Close()

End Function

下面是 getSoapHeader() 函数。如前所述,仅当您使用 type="ns2:Map" 时才需要 ns2 部分,这是关联数组所需要的:

    Private Function getSoapHeader() As String
    'ns2 is not always needed
    getSoapHeader = "<?xml version=""1.0"" encoding=""UTF-8""?><SOAP-ENV:Envelope xmlns:SOAP-ENV=""http://schemas.xmlsoap.org/soap/envelope/"" xmlns:ns1=""urn:Magento"" xmlns:xsd=""http://www.w3.org/2001/XMLSchema"" xmlns:xsi=""http://www.w3.org/2001/XMLSchema-instance"" xmlns:SOAP-ENC=""http://schemas.xmlsoap.org/soap/encoding/"" xmlns:ns2=""http://xml.apache.org/xml-soap"" SOAP-ENV:encodingStyle=""http://schemas.xmlsoap.org/soap/encoding/""> " & vbCrLf

End Function

【讨论】:

  • 我在 android 中使用 v2 api 时遇到了同样的问题。你能指导我如何在 vb 中做到这一点,以便我可以了解如何在 android 中做到这一点。
  • @Droider 我添加了一些您可以用作指南的代码。如果您有更多问题,我会尽力提供帮助。
【解决方案2】:

回答一个您没有提出的问题——但是您是否考虑过为 V1 API 使用 XML-RPC 适配器?它公开了与 SOAP API 完全相同的方法,但由于 XML-RPC 没有 SOAP 所具有的相同类型的强大概念,您可能能够从.NET 获得一个通用对象(在不熟悉的情况下说.NETSOAP 或 XML-RPC 库)

【讨论】:

  • 我给你投了赞成票,因为这是我可以走的路线。但是我认为 .NET 和关联数组将成为问题。我想我有一个答案,我会在完成后发布。
猜你喜欢
  • 1970-01-01
  • 2018-07-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-30
  • 1970-01-01
  • 1970-01-01
  • 2018-12-30
相关资源
最近更新 更多