Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to call the Magento API from VB.NET

Magento has an API and it seems some people are using it via VB.NET but I cannot get it to work after trying for many hours.

I’m on Magento 1.7.0.2 Trying to get a VB.NET app working with the API. I’m using the WS-I compliant web service setting.

Error 1 Custom tool error: Unable to import WebService/Schema. Unable to import binding ‘Mage_Api_Model_Server_Wsi_HandlerBinding’ from namespace ‘urn:Magento’. The operation ‘catalogProductAttributeRemove’ on portType ‘Mage_Api_Model_Server_Wsi_HandlerPortType’ from namespace ‘urn:Magento’ had the following syntax error: The operation has no matching binding. Check if the operation, input and output names in the Binding section match with the corresponding names in the PortType section. d:\Documents\Visual Studio 2010\Projects\Mage\Mage\My Project\Settings.settings 1 1 Mage

if I try to add it as a Service Reference (instead of a Web Reference) I get a different set of errors.

Cannot import wsdl:binding Cannot import wsdl:port Cannot import wsdl:portType

Error 5 Custom tool error: Failed to generate code for the service reference ‘ServiceReference1’. Please check other error and warning messages for details. d:\Documents\Visual Studio 2010\Projects\Mage\Mage\Service References\ServiceReference1\Reference.svcmap 1 1 Mage

Warning 3 Custom tool warning: Cannot import wsdl:binding Detail: There was an error importing a wsdl:portType that the wsdl:binding is dependent on. XPath to wsdl:portType: //wsdl:definitions[@targetNamespace=’urn:Magento’]/wsdl:portType[@name=’Mage_Api_Model_Server_Wsi_HandlerPortType’] XPath to Error Source: //wsdl:definitions[@targetNamespace=’urn:Magento’]/wsdl:binding[@name=’Mage_Api_Model_Server_Wsi_HandlerBinding’] d:\Documents\Visual Studio 2010\Projects\Mage\Mage\Service References\ServiceReference1\Reference.svcmap 1 1 Mage

Warning 4 Custom tool warning: Cannot import wsdl:port Detail: There was an error importing a wsdl:binding that the wsdl:port is dependent on. XPath to wsdl:binding: //wsdl:definitions[@targetNamespace=’urn:Magento’]/wsdl:binding[@name=’Mage_Api_Model_Server_Wsi_HandlerBinding’] XPath to Error Source: //wsdl:definitions[@targetNamespace=’urn:Magento’]/wsdl:service[@name=’MagentoService’]/wsdl:port[@name=’Mage_Api_Model_Server_Wsi_HandlerPort’] d:\Documents\Visual Studio 2010\Projects\Mage\Mage\Service References\ServiceReference1\Reference.svcmap 1 1 Mage

Warning 2 Custom tool warning: Cannot import wsdl:portType Detail: An exception was thrown while running a WSDL import extension: System.ServiceModel.Description.XmlSerializerMessageContractImporter Error: Element message named catalogProductAttributeRemoveRequest from namespace urn:Magento is missing. XPath to Error Source: //wsdl:definitions[@targetNamespace=’urn:Magento’]/wsdl:portType[@name=’Mage_Api_Model_Server_Wsi_HandlerPortType’] d:\Documents\Visual Studio 2010\Projects\Mage\Mage\Service References\ServiceReference1\Reference.svcmap 1 1 Mage

Can someone give me very explicit instruction/code on how to make a call and get a result? I can't even seem to get the initial configuration correct. I've downloaded some code others have provided online, but if doesn't work--probably because it was for a earlier version.

like image 406
Max Hodges Avatar asked Aug 23 '12 09:08

Max Hodges


2 Answers

Function getHTTPStream() As String
    Dim myh As HttpWebRequest = _
    HttpWebRequest.Create("http://yourmagentoweb/soap/api/?wsdl")
    myh.Timeout = 30000
    myh.UserAgent = "Test"
    Dim myR As HttpWebResponse = myh.GetResponse()
    Dim myEnc As Encoding = Encoding.GetEncoding(1252)
    Dim mySr As StreamReader = New StreamReader(myR.GetResponseStream(), myEnc)

    Return mySr.ReadToEnd()
End Function

That code needs tweaking obviously- i have not got time to prettify this stuff


from Abid Hussain's link

1. Using wdsl tool I created a .vb source file by calling:

wsdl /language:VB /out:MageProxyClass.vb http:///api/v2_soap?wsdl

2. Afterwards I used the VB Comand Line Editor to compile the sourcefile into a dll.

vbc /out:MageProxyClass.dll /t:library /r:System.XML.dll,System.Web.Services.dll MageProxyClass.vb

3. Finally I was able to create an instance of MagentoService class defined in my MageProxyClass.dll

Private WithEvents msvc As New MagentoService() 

4. Example:

 Public Class main
    Private WithEvents msvc As New MagentoService()
    Private ssid As String
    Private Sub main_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

    End Sub

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        ListBox1.Items.Clear()
        ListBox1.Items.Add("Trying to connect")
        msvc.loginAsync("xxxx", "xxxxxxxxxxxxxxxx")
    End Sub

    Public Sub MageLoginComplete(ByVal sender As System.Object, ByVal e As loginCompletedEventArgs) Handles msvc.loginCompleted
        ListBox1.Items.Add("Login completed")
        ssid = e.Result
        ListBox1.Items.Add(String.Concat("Session ID: ", ssid))
    End Sub
End Class 
like image 120
Josua Marcel C Avatar answered Oct 24 '22 07:10

Josua Marcel C


Finally got this working.

Add your webservice as usual (it will fail to compile but add it anyway)

Open Magento.wsdl (or whatever your VS has called the wsdl file in your web reference) and remove the call to catalogProductAttributeRemove completely.

 <!--wsdl:operation name="catalogProductAttributeRemove">
    <wsdl:documentation>Delete attribute</wsdl:documentation>
    <wsdl:input message="typens:catalogProductAttributeRemoveRequest" />
    <wsdl:output message="typens:catalogProductAttributeRemoveResponse" />
</wsdl:operation-->

Fire up the Visual Studio Command Prompt and navigate to your project, then the "Web References"

Type: wsdl /language:VB /out:Reference.vb Magento.wsdl /namespace:com.yourwebservicename.www

This will correctly generate the reference.vb file you need to continue.

like image 3
fritterfatboy Avatar answered Oct 24 '22 07:10

fritterfatboy