calling nav web service from android
 
            
                
                    navAndroid                
                
                    Member Posts: 2                
            
                        
            
                    I'm trying to call a ms dynamics Nav (2013 R2) web service from an android application using Ksoap libreries, but i keep getting this exception "java.lang.IllegalArgumentException:size<=0" ! I do not know what can be the reason! Is the autnetication code correct? Can you help me please?!
this is my code:
this is the wsdl :
The code unit i used is so simple, it takes an int and returns a simple text "hello world".
I enabled SOAP services and activate NTLM authentication.
Is there an auther thing to configure?
                this is my code:
import java.io.IOException;
    import java.net.Authenticator;
    import java.net.PasswordAuthentication;
    import java.util.ArrayList;
    import java.util.List;
    import org.ksoap2.HeaderProperty;
    import org.ksoap2.SoapEnvelope;
    import org.ksoap2.serialization.PropertyInfo;
    import org.ksoap2.serialization.SoapObject;
    import org.ksoap2.serialization.SoapPrimitive;
    import org.ksoap2.serialization.SoapSerializationEnvelope;
    import org.ksoap2.transport.HttpTransportSE;
    import org.xmlpull.v1.XmlPullParserException;
    import android.app.Activity;
    import android.os.AsyncTask;
    import android.os.Bundle;
    import android.view.View;
    import android.view.View.OnClickListener;
    import android.widget.Button;
    import android.widget.TextView;
    public class Main extends Activity {
        private final String namespace = "urn:microsoft-dynamics-schemas/codeunit/MonService";
        private final String url = "http://[@ip]:7047/DynamicsNAV71/WS/ATLAS%20AUTO/Codeunit/MonService";   
        private final String soap_action = "urn:microsoft-dynamics-schemas/codeunit/MonService:Hello";
        private final String method_name = "Hello";
        String great="";
        TextView txt;
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
   txt=(TextView)findViewById(R.id.text);
    Button bt=(Button)findViewById(R.id.btn);
    bt.setOnClickListener(new OnClickListener() {
        @Override
        public void onClick(View v) {
            new Task().execute();
        }
    }) ;
}
public String maMethode(){
    try
    {
          SoapObject request = new SoapObject(namespace, method_name);
          //Property which holds input parameters
            PropertyInfo celsiusPI = new PropertyInfo();
            //Set Name
            celsiusPI.setName("par");
            int n=123;
            //Set Value
            celsiusPI.setValue(n);
            celsiusPI.setType(int.class);
            request.addProperty(celsiusPI);
            SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);
          //envelope.bodyOut=request;
           envelope.dotNet = true;   
           envelope.setOutputSoapObject(request);   
           HttpTransportSE transport = new HttpTransportSE(url);    
           try{
                List<HeaderProperty> headerList = new ArrayList<HeaderProperty>();
                headerList.add(new HeaderProperty("Authorization", "Basic " + org.kobjects.base64.Base64.encode("domain\\user:password".getBytes())));
               transport.call(soap_action, envelope);   
           }catch(IOException e )
           {
               e.printStackTrace();
              // System.out.println(e.toString()+"1");
               great=e.toString();
           }
           catch(XmlPullParserException e)
           {
               e.printStackTrace();
               //System.out.println(e.toString()+"2");
               great=e.toString();
           }
           if(envelope.bodyIn != null){
               SoapPrimitive result = (SoapPrimitive) envelope.getResponse(); 
               great= result.toString();
           }
           return great;
    }
    catch (Exception e)
    {
        e.printStackTrace();
       // System.out.println(e.toString()+"" );
        great = e.toString();
        return great;
    }
}
public class Task extends AsyncTask<Void,Void,Void>
{
    @Override
    protected Void doInBackground(Void... params) {
        // TODO Auto-generated method stub
        great=maMethode();
        return null;
    }
    @Override
    protected void onPostExecute(Void result) {
        //Log.i(TAG, "doInBackground");
        txt.setText(great);
    }
}}
this is the wsdl :
<definitions xmlns="http://schemas.xmlsoap.org/wsdl/" xmlns:tns="urn:microsoft-dynamics-schemas/codeunit/MonService" targetNamespace="urn:microsoft-dynamics-schemas/codeunit/MonService">
    <types>
    <schema xmlns="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" targetNamespace="urn:microsoft-dynamics-schemas/codeunit/MonService">
    <element name="Hello">
    <complexType>
    <sequence>
    <element minOccurs="1" maxOccurs="1" name="par" type="int"/>
    </sequence>
    </complexType>
    </element>
    <element name="Hello_Result">
    <complexType>
    <sequence>
    <element minOccurs="1" maxOccurs="1" name="return_value" type="string"/>
    </sequence>
    </complexType>
    </element>
    </schema>
    </types>
    <message name="Hello">
    <part name="parameters" element="tns:Hello"/>
    </message>
    <message name="Hello_Result">
    <part name="parameters" element="tns:Hello_Result"/>
    </message>
    <portType name="MonService_Port">
    <operation name="Hello">
    <input name="Hello" message="tns:Hello"/>
    <output name="Hello_Result" message="tns:Hello_Result"/>
    </operation>
    </portType>
    <binding name="MonService_Binding" type="tns:MonService_Port">
    <binding xmlns="http://schemas.xmlsoap.org/wsdl/soap/" transport="http://schemas.xmlsoap.org/soap/http"/>
    <operation name="Hello">
    <operation xmlns="http://schemas.xmlsoap.org/wsdl/soap/" soapAction="urn:microsoft-dynamics-schemas/codeunit/MonService:Hello" style="document"/>
    <input name="Hello">
    <body xmlns="http://schemas.xmlsoap.org/wsdl/soap/" use="literal"/>
    </input>
    <output name="Hello_Result">
    <body xmlns="http://schemas.xmlsoap.org/wsdl/soap/" use="literal"/>
    </output>
    </operation>
    </binding>
    <service name="MonService">
    <port name="MonService_Port" binding="tns:MonService_Binding">
    <address xmlns="http://schemas.xmlsoap.org/wsdl/soap/" location="http://@ip:7047/DynamicsNAV71/WS/ATLAS%20AUTO/Codeunit/MonService"/>
    </port>
    </service>
    </definitions>
The code unit i used is so simple, it takes an int and returns a simple text "hello world".
I enabled SOAP services and activate NTLM authentication.
Is there an auther thing to configure?
0                
            Categories
- All Categories
- 73 General
- 73 Announcements
- 66.6K Microsoft Dynamics NAV
- 18.7K NAV Three Tier
- 38.4K NAV/Navision Classic Client
- 3.6K Navision Attain
- 2.4K Navision Financials
- 116 Navision DOS
- 851 Navision e-Commerce
- 1K NAV Tips & Tricks
- 772 NAV Dutch speaking only
- 617 NAV Courses, Exams & Certification
- 2K Microsoft Dynamics-Other
- 1.5K Dynamics AX
- 323 Dynamics CRM
- 111 Dynamics GP
- 10 Dynamics SL
- 1.5K Other
- 990 SQL General
- 383 SQL Performance
- 34 SQL Tips & Tricks
- 35 Design Patterns (General & Best Practices)
- 1 Architectural Patterns
- 10 Design Patterns
- 5 Implementation Patterns
- 53 3rd Party Products, Services & Events
- 1.6K General
- 1.1K General Chat
- 1.6K Website
- 83 Testing
- 1.2K Download section
- 23 How Tos section
- 252 Feedback
- 12 NAV TechDays 2013 Sessions
- 13 NAV TechDays 2012 Sessions