Webservice SOAP in Android

2020-04-17 06:22发布

问题:

I'm starting to use webservices in Android and I followed this tutorial: Create Web Service in Java Using Apache Axis2 and Eclipse to create and consume the webservice. This tutorial explain the client side application in Java but with some others tutorials I was able to consume the WS in Android like this:

package com.android.webservices;

import org.ksoap2.SoapEnvelope;
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.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;

public class AddNumbersWSActivity extends Activity {
/** Called when the activity is first created. */

private String METHOD_NAME = "addTwoNumbers"; // our webservice method name
private String NAMESPACE = "http://sencide.com"; // Here package name in webservice with reverse order.
private String SOAP_ACTION = "http://sencide.com/addTwoNumbers"; // NAMESPACE + method name
private static final String URL = "http://192.168.1.214:8080/axis2/services/FirstWebService?wsdl"; // you must use ipaddress here, don’t use Hostname or localhost

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    Button addButton = (Button) findViewById(R.id.button1);

    addButton.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View arg0) {
            // TODO Auto-generated method stub
            try
            {
                SoapObject request = new SoapObject(NAMESPACE, METHOD_NAME);
                EditText num1 = (EditText) findViewById(R.id.editText1);
                EditText num2 = (EditText) findViewById(R.id.editText2);
                request.addProperty("firstNumber", Integer.valueOf(num1.getText().toString()));
                request.addProperty("secondNumber", Integer.valueOf(num2.getText().toString()));
                SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);
//                  envelope.dotNet = true;
                    envelope.setOutputSoapObject(request);
                    HttpTransportSE androidHttpTransport = new HttpTransportSE(URL);
                    androidHttpTransport.call(SOAP_ACTION,envelope);
                    Object result = envelope.getResponse();
                    System.out.println("Result : " + result.toString());
                    ((TextView) findViewById (R.id.textView4)).setText(result.toString());
                } catch (Exception E) {
                    E.printStackTrace();
                }
            }
        });

    }
}

But now I have some questions about consuming WS in Android:

  1. As I can see here, the kSOAP2 library is deprecated... Should I continue to use this library or I need another tool? If yes, which one?
  2. Is it possible to know the NAMESPACE, METHOD_NAME, SOAP_ACTION using only the WSDL of the service?
  3. Can I generate some code automatically using WSDL (like WSDL2Java tool that is used for Java applications)?
  4. At the addProperty(String name, Object value) method, can I used arbitrary name or it should follow a rule?

Thanks in advance!

回答1:

Apache Axis is for Java and do not work in Android platform. Ksoap2 library is an alternate for this and mostly used tool to consuming webservices in Android. For your questions:

1 - Today [15.5.2012] i can see the last commit only 4 days ago in here

2 - Yes it is possible. The namespace describes like as follow:

<wsdl:definitions targetNamespace="http://tempuri.org/">

And method(s) name(s) describes like as follow:

<s:element name="YourMethodName">

And SOAP action is genarally consist NAMESPACE + METHOD_NAME;

3 - As I know, there is no well written project for now.

4 - It should follow a rule that must be mach to WSDL's attributes name and case sensitivity