かなりの掘り下げが必要でしたが、私はそれをすべて機能させています。まず、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本体を作成する必要があります。必要なXMLを出力するAPI呼び出しごとにクラスを作成しました。System.Net、System.Xml、およびSystem.IOが必要になります。リクエストに含まれる一般的なXMLがあるため、getSoapHeader()を使用しました。詳細については、次のコードセクションを参照してください。
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()関数です。前述のように、ns2の部分は、連想配列に必要なtype = "ns2:Map"を使用している場合にのみ必要です。
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