Magento API SOAP v1和VB.NET

时间:2013-01-11 20:28:41

标签: api magento soap

我正在使用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中工作了。

2 个答案:

答案 0 :(得分:1)

回答您没有问过的问题 - 但您是否考虑过使用适用于V1 API的XML-RPC适配器?它暴露了与SOAP API相同的精确方法,但由于XML-RPC没有与SOAP相同的强类型概念,因此您可以从.NET获得通用对象(不是说熟悉.NET SOAP或XML-RPC库)

答案 1 :(得分:0)

需要花费很多时间,但我一切都在努力。首先,我使用了PHP SoapClient,并注意到它在soap请求中如何形成关联数组。您可以跟踪请求和响应,非常方便。从那里我使用WebRequest对象在VB.NET中编写了自己的soap客户端。这样,我就可以完全控制发送给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