0

我正在使用 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 中使用它,而不是这种情况。

4

2 回答 2

1

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

于 2013-01-11T21:33:56.653 回答
0

这需要大量的挖掘,但我已经完成了所有工作。首先,我使用了 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
于 2013-01-15T22:59:13.500 回答