48 votes

Comment appeler un .NET Service web à partir d'Android à l'aide de KSOAP2?

J'ai un problème lors d'un appel à un webservice. J'ai un .NET service web sur le serveur, et je suis en utilisant KSOAP2 (ksoap2-j2se-plein 2.1.2) dans Android. Lors de l'exécution du programme, j'ai eu une exception d'exécution comme "org.ksoap2.la sérialisation.SoapPrimitive". Que dois-je faire?

Voici mon code.

package projects.ksoap2sample;

import org.ksoap2.SoapEnvelope;
import org.ksoap2.serialization.SoapObject;
import org.ksoap2.serialization.SoapSerializationEnvelope;
import org.ksoap2.transport.HttpTransportSE;

import android.app.*;
import android.os.*;
import android.widget.TextView;

public class ksoap2sample extends Activity {
    /** Called when the activity is first created. */
    private static final String SOAP_ACTION = "http://tempuri.org/HelloWorld";
    private static final String METHOD_NAME = "HelloWorld";
    private static final String NAMESPACE = "http://tempuri.org/";
    private static final String URL = "http://192.168.1.19/TestWeb/WebService.asmx";
    TextView tv;
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        tv=(TextView)findViewById(R.id.text1);

        try {
            SoapObject request = new SoapObject(NAMESPACE, METHOD_NAME);

            //request.addProperty("prop1", "myprop");

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

            HttpTransportSE androidHttpTransport = new HttpTransportSE(URL);

            androidHttpTransport.call(SOAP_ACTION, envelope);

            Object result = (Object)envelope.getResponse();

            String[] results = (String[])  result;
            tv.setText( ""+results[0]);
        }
        catch (Exception e) {
            tv.setText(e.getMessage());
        }
    }
}

24voto

HaKr Points 560

C'est très simple. Vous obtenez le résultat en Object qui est une église primitive.

Votre code:

Object result = (Object)envelope.getResponse();

Bon code:

SoapObject result=(SoapObject)envelope.getResponse();

//To get the data.
String resultData=result.getProperty(0).toString();
// 0 is the first object of data.

Je pense que cela devrait fonctionner.

14voto

SchlaWiener Points 9682

Comment votre .NET Webservice ressembler?

J'ai eu le même effet en utilisant ksoap 2.3 de code.google.com. J'ai suivi le tutoriel sur Le Projet de Code (ce qui est excellent BTW.)

Et à chaque fois que j'ai utilisé

    Integer result = (Integer)envelope.getResponse();

pour obtenir le résultat de mon webservice (quel que soit le type, j'ai essayé de l'Objet, String, int), j'ai couru dans l' org.ksoap2.serialization.SoapPrimitive d'exception.

J'ai trouvé une solution (solution de contournement). La première chose que j'avais à faire était de supprimer le "SoapRpcMethod() de l'attribut de mon webservice méthodes.

    [SoapRpcMethod(), WebMethod]
    public Object GetInteger1(int i)
    {
        // android device will throw exception
        return 0;
    }

    [WebMethod]
    public Object GetInteger2(int i)
    {
        // android device will get the value
        return 0;
    }

Puis j'ai changé mon code Android pour:

    SoapPrimitive result = (SoapPrimitive)envelope.getResponse();

Cependant, je reçois un SoapPrimitive objet, qui a une "valeur", déposée qui est privé. Heureusement, la valeur est passée à travers l' toString() méthode, donc j'utilise Integer.parseInt(result.toString()) pour obtenir ma valeur, ce qui est suffisant pour moi, car je n'ai pas de types complexes que j'ai besoin pour obtenir à partir de mon Web service.

Voici la source:

private static final String SOAP_ACTION = "http://tempuri.org/GetInteger2";
private static final String METHOD_NAME = "GetInteger2";
private static final String NAMESPACE = "http://tempuri.org/";
private static final String URL = "http://10.0.2.2:4711/Service1.asmx";

public int GetInteger2() throws IOException, XmlPullParserException {
    SoapObject request = new SoapObject(NAMESPACE, METHOD_NAME);

    PropertyInfo pi = new PropertyInfo();
    pi.setName("i");
    pi.setValue(123);
    request.addProperty(pi);

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

    AndroidHttpTransport androidHttpTransport = new AndroidHttpTransport(URL);
    androidHttpTransport.call(SOAP_ACTION, envelope);

    SoapPrimitive result = (SoapPrimitive)envelope.getResponse();
    return Integer.parseInt(result.toString());
}

7voto

ali Points 71

Transtypage de l'enveloppe pour SoapPrimitive:

SoapPrimitive result = (SoapPrimitive)envelope.getResponse();
String strRes = result.toString();

et il va fonctionner.

4voto

Sachin D Points 728

Vous pouvez Utiliser le code ci-dessous pour appeler le service web et obtenir de réponse .Assurez-vous que votre Service Web de retourner la réponse dans un Format de Tableau des Données..Ce code vous aider si vous utilisez des données à partir de SQL Server base de données .Si vous vous en utilisant MYSQL vous avez besoin de changer une chose, il suffit de remplacer le mot NewDataSet de la sentence obj2=(SoapObject) obj1.getProperty("NewDataSet"); par DocumentElement

private static final String NAMESPACE = "http://tempuri.org/"; 
private static final String URL ="http://localhost/Web_Service.asmx?";// you can use   IP address instead of localhost
private static final String METHOD_NAME = "Function_Name";
private static final String SOAP_ACTION = NAMESPACE+METHOD_NAME;

SoapObject request = new SoapObject(NAMESPACE, METHOD_NAME); 
request.addProperty("parm_name",prm_value);// Parameter for Method
SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11); 
envelope.dotNet = true;
envelope.setOutputSoapObject(request);
HttpTransportSE androidHttpTransport = new HttpTransportSE(URL);
try {
androidHttpTransport.call(SOAP_ACTION, envelope);//call the eb service Method
} catch (Exception e) {
e.printStackTrace();}//Next task is to get Response and format that response
SoapObject obj,obj1,obj2,obj3;
obj= (SoapObject) envelope.getResponse();
obj1=(SoapObject) obj.getProperty("diffgram");
obj2=(SoapObject) obj1.getProperty("NewDataSet");
for(int i=0;i<obj2.getPropertyCount();i++)//the method getPropertyCount() return the number of rows
{
obj3=(SoapObject) obj2.getProperty(i);  
obj3.getProperty(0).toString();//value of column 1
obj3.getProperty(1).toString();//value of column 2
//like that you will get value from each column
}

Si vous avez un problème concernant ce que vous pouvez m'écrire..

3voto

Glad To Help Points 1921

Vous aussi pourriez envisager ce tutoriel d'initiation sur KSOAP Android

http://seesharpgears.blogspot.com/2010/11/basic-ksoap-android-tutorial.html

Espérons que cela vous aide

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X