Search code examples
androidsql-serverweb-servicesasmxsomee

android - connect to web service


I'm try to connect android application to a web service uploaded on somee.

I have the following problem :

FATAL EXCEPTION: main java.lang.RuntimeException: Unable to start activity ComponentInfo: java.lang.NullPointerException

the web service code :

[WebService(Namespace = "http://www.n-m.somee.com/")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
[System.ComponentModel.ToolboxItem(false)]
// To allow this Web Service to be called from script, using ASP.NET AJAX, uncomment the following line. 
// [System.Web.Script.Services.ScriptService]
public class WebService1 : System.Web.Services.WebService
{
    SqlConnection con = new SqlConnection(@"workstation id=WSDatabase.mssql.somee.com;packet size=4096;user id=***;pwd=***;data source=WSDatabase.mssql.somee.com;persist security info=False;initial catalog=WSDatabase ");
    [WebMethod]
    public string get_name(String pssw)
    {
        con.Open();
        SqlCommand cmd = new SqlCommand("select username from users where pssw="+pssw, con);
        string rd =(string) cmd.ExecuteScalar();

        con.Close();
        return rd;
    }
}

I added the following line to manifest file:

** MainActivity.java file**

public class MainActivity extends AppCompatActivity {

protected String namespace="http://www.n-m.somee.com/";
protected String url="http://www.n-m.somee.com/WebService1.asmx";
protected String SOAPAction="http://www.n-m.somee.com/get_name";
protected String method_name= "get_name";

TextView user_name;
@SuppressLint("NewApi")

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
    setSupportActionBar(toolbar);
}


public void goButton(View v)
{
    user_name=(TextView)findViewById(R.id.textView1);
    //allow internet
    if(Build.VERSION.SDK_INT>9)
    {
        StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
        StrictMode.setThreadPolicy(policy);
    }

    //create soap object
    SoapObject soapObject=new SoapObject(namespace,method_name);
    soapObject.addProperty("pssw", "1234");

    //create envelop
    SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);
    envelope.dotNet = true;
    envelope.setOutputSoapObject(soapObject);

    //Rrquest get data from webservice and set it into soapobject

    HttpTransportSE transport = new HttpTransportSE(url);

    try {
        transport.call(SOAPAction, envelope);

        // get data
        SoapPrimitive output=(SoapPrimitive) envelope.getResponse();
        //set data into control
        user_name.setText("pssw: "+output.toString());

    } catch (IOException e) {
        e.printStackTrace();
     } catch (XmlPullParserException e) {
        e.printStackTrace();
    }

}
}

I appreciate any help thank you


Solution

  • Your urls were a bit wrong. This is what I used,

    protected String namespace = "http://www.nourhan-m.somee.com/";
    protected String url = "http://www.nourhan-m.somee.com/WebService1.asmx";
    protected String SOAPAction = "http://www.nourhan-m.somee.com/get_name";
    protected String method_name = "get_name";
    

    I made some modification to your code to make it work.

    public String callService(String username) {
        //create soap object and add params to it
        SoapObject request = new SoapObject(namespace, method_name);
        request.addProperty("pssw", username);
    
        //create envelop
        SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);
        envelope.dotNet = true;
    
        //set request to envelope
        envelope.bodyOut = request;
    
        HttpTransportSE transport = new HttpTransportSE(url);
        transport.debug = true;
        try {
            transport.call(SOAPAction, envelope);
            Log.e("OUT", transport.requestDump);
            return transport.responseDump;
        } catch (IOException e) {
            e.printStackTrace();
        } catch (XmlPullParserException e) {
            e.printStackTrace();
        } catch (Exception e){
            e.printStackTrace();
        }
        return "";
    }
    

    This is how I invoked the method,

    You can invoke it as follows,

    final String username = (TextView) findViewById(R.id.textView1)
    
    new Thread(new Runnable() {
        @Override
        public void run() {
            Log.e("OUT", callService(username));
        }
    }).start();
    

    I got an empty response, maybe it's because I didn't give a valid username. Have a look at it. Cheers :)