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