How to pass parameter to a webservice using ksoap2?

44,277

Solution 1

Instead of

    request.addProperty("a", "myprop"); 

try using

    request.addProperty("arg0", "myprop");         

I'm not an expect on ksoap2 but i'm pretty sure this sets the value of the first parameter to your web service function. Has worked perfectly for me.

Solution 2

I have been working with this for 2 days now and i finally got the solution. I submit my complete code and hope this will help. It Can pass Parameters and get response.

Inside the WebService file in .net C#:

[WebService(Namespace = "http://something/webservice/v1")]

[WebMethod]
public DateTime[] Function(Guid organizationId, Guid categoryId)
    {
        return ...;
    }

Inside the Android code:

private final static String URL = "http://something/WebServices/WebService.asmx";
private final static String NAMESPACE = "http://something/webservice/v1";


public ArrayList<Object> getSoapObject(String METHOD_NAME, String SOAP_ACTION, Map<String, String> parameters){

try {

        ArrayList<Object> sol = new ArrayList<Object>();
        SoapObject request = new SoapObject(NAMESPACE, METHOD_NAME);

        if(parameters != null){
            for (Entry<String, String> para : parameters.entrySet()) {
                request.addProperty(para.getKey(), para.getValue());
            }
        }

        SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);
        envelope.dotNet=true;
        envelope.setOutputSoapObject(request);

        Log.d("Body", envelope.bodyOut.toString());

        HttpTransportSE androidHttpTransport = new HttpTransportSE(URL);
        androidHttpTransport.call(SOAP_ACTION, envelope);
        SoapObject result=(SoapObject)envelope.getResponse();

            for(int i = 0; i < result.getPropertyCount(); i++){
                sol.add(result.getProperty(i));
            }

            return sol;
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }       
    }


    public void getMenuEndDate(String orgId, String categoryId){

        Date startDate = null;
        Date endDate = null;

        HashMap<String, String> parameters = new HashMap<String, String>();
        parameters.put("organizationId", orgId);
        parameters.put("categoryId", categoryId);


        ArrayList<Object> sol = getSoapObject("Function", "http://something/webservice/v1/Function", parameters);

        SimpleDateFormat dateFormatter = new SimpleDateFormat("yyyy-MM-dd");

        try {
            startDate = (Date)dateFormatter.parse(sol.get(0).toString());
            endDate = (Date)dateFormatter.parse(sol.get(1).toString());
        } catch (ParseException e) {
            Log.d(TAG, "Exception i Date-Formatering");
            e.printStackTrace();
        }

    }

Things to check:

  • Are the parameters named exactly the same as what is expected in the Web Service?
  • Check if you use Trailing "/" for the Namespace. Have the same in you application.

Solution 3

Calling webservice by passing parameters from j2me

SoapObject request = new SoapObject("http://www.webserviceX.NET", "GetCitiesByCountry");
String soapAction = "http://www.webserviceX.NET/GetCitiesByCountry";

request.addProperty("CountryName", "india");
SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);
envelope.bodyOut = request;
envelope.dotNet = true;

HttpTransport ht = new HttpTransport("http://www.webservicex.net/globalweather.asmx");
ht.debug = true;
//System.err.println( ht.requestDump );

ht.call(soapAction,envelope);
System.out.println("####################: " +envelope.getResponse());
//SoapObject result = (SoapObject)envelope.getResponse();

Solution 4

Try commenting out the line:

envelope.dotNet=true;

I did the same thing you did and when I read about this property being a really ugly hack, I commented it out for testing purposes and my parameter got passed correctly.

Solution 5

You will have to declare parameter type in client code:

SoapObject request = new SoapObject("http://tempuri.org/", "mymethod"); 
PropertyInfo p = new PropertyInfo();
p.setName("param_name_from_webservice");
p.setValue(true);
p.setType(Boolean.class);
request.addProperty(p);
Share:
44,277
Admin
Author by

Admin

Updated on September 21, 2020

Comments

  • Admin
    Admin over 3 years

    I'm using Eclipse IDE to develop an android app. I'm trying to connect to a .net webservice. I'm using ksoap2 version 2.3

    When I'm calling a webmethod with no parameters, it works fine. When I come to pass a parameter to the webmethod, I get null (while debugging the webservice I discovered that) and I get a null from the webmethod in the client side code.

    Code:

    package com.examples.hello;
    import org.ksoap2.SoapEnvelope;
    import org.ksoap2.serialization.PropertyInfo;
    import org.ksoap2.serialization.SoapObject;
    import org.ksoap2.serialization.SoapSerializationEnvelope;
    import org.ksoap2.transport.HttpTransportSE;
    
    import android.app.Activity;
    import android.os.Bundle;
    import android.widget.TextView;
    public class HelloActivity extends Activity {
        /** Called when the activity is first created. */
     private static final String SOAP_ACTION = "http://Innovation/HRService/stringBs";
    
     private static final String METHOD_NAME = "stringBs";
    
     private static final String NAMESPACE = "http://Innovation/HRService/";
     private static final String URL = "http://196.205.5.170/mdl/hrservice.asmx";
     TextView tv;
    
     @Override
     public void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
         setContentView(R.layout.main);
         tv=(TextView)findViewById(R.id.text1);
         call();
    
     }
    
     public void call()
     {
             try {
    
              SoapObject request = new SoapObject(NAMESPACE, METHOD_NAME);
              //PropertyInfo PI = new PropertyInfo();
    
                 //request.addProperty("a", "myprop");
    
                 SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);
                 envelope.setOutputSoapObject(request);
    
                 envelope.dotNet=true;
                 envelope.encodingStyle = SoapSerializationEnvelope.XSD;
    
    
                 HttpTransportSE androidHttpTransport = new HttpTransportSE(URL);
    
                 androidHttpTransport.call(SOAP_ACTION, envelope);
    
                 Object result = (Object)envelope.getResponse();
    
    
                 String results = result.toString();
                 tv.setText( ""+results); 
             } catch (Exception e) {
                 tv.setText(e.getMessage());
                 }
         }
    
    
    }
    

    Why do I get the null response, how do I pass a parameter to a webservice using ksoap2?