这需要大量的挖掘,但我已经完成了所有工作。首先,我使用了 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