0

VB.NETを使用して、APISOAPv1を介してMagentoと通信しています。連想配列が必要な呼び出しに到達するまで、問題なく動作していました。辞書、ハッシュテーブル、カスタムタイプなどを試しました。ハッシュテーブルを読みましたが、辞書はシリアル化できません。そこで、カスタムタイプ/オブジェクト/クラスを試しました。以下は私が受け取ったエラーです:

The type XXXX was not expected. Use the Xmlinclude or SoapInclude attribute to specify types that are not known statically.

そのため、上記のエラーに関して多くの投稿を読みましたが、何も機能しません。エラーは、少なくとも私が試していることが正しく行われれば可能であると言っているようですが、そうではないかもしれません。私はSOAPについてあまり知りませんが、Webサービスがオブジェクトの処理方法を知らない可能性があるため、これが機能しないことがわかります。

だから私の質問は、カスタムオブジェクトをMagentoAPIに送信できるかどうかです。または、もっと広く、SOAPv1をVB.NETで動作させることは可能です。私はv2がオプションであることを知っていますが、私はv1にかなり精通しており、このシナリオ以外のVB.NETですでに機能しています。

4

2 に答える 2

1

質問しなかった質問に答えますが、V1 APIにXML-RPCアダプターを使用することを検討しましたか?これはSOAPAPIとまったく同じメソッドを公開しますが、XML-RPCにはSOAPと同じ強力な型の概念がないため、 ( SOAPやXML.NETに精通していなくても)一般的なオブジェクトを取得できる可能性があります。 .NET-RPCライブラリ)

于 2013-01-11T21:33:56.653 に答える
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本体を作成する必要があります。必要な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
于 2013-01-15T22:59:13.500 に答える