Веб-служба SOAP с библиотекой ksoap2

Я пытаюсь использовать веб-службу .net SOAP с библиотекой ksoap2. Пример с http://www.vimeo.com/9633556 показывает, как это сделать правильно. Ниже код из этого примера. все должно работать нормально! но я получаю принудительное закрытие ошибки!

вот мой код:

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

import android.app.Activity;
import android.os.Bundle;
import android.widget.TextView;

public class SoapTest2Activity extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    TextView TV ;
    TV=(TextView)findViewById(R.id.textView1);
    TV.setText("Hi");

    String SOAP_ACTION = "http://tempuri.org/CelsiusToFahrenheit";
    String METHOD_NAME = "CelsiusToFahrenheit";
    String NAMESPACE = "http://tempuri.org/";
    String URL = "http://www.w3schools.com/webservices/tempconvert.asmx";

    System.setProperty("http.keepAlive", "false");

    SoapObject Request = new SoapObject(NAMESPACE, METHOD_NAME);
    Request.addProperty("Celsius", "32");

    SoapSerializationEnvelope soapEnvelope = new                       SoapSerializationEnvelope(SoapEnvelope.VER11);
    soapEnvelope.dotNet = true;
    soapEnvelope.setOutputSoapObject(Request);

    HttpTransportSE httpTransport = new HttpTransportSE(URL);
    try
    {
        httpTransport.call(SOAP_ACTION, soapEnvelope);
        SoapPrimitive resultString = (SoapPrimitive)soapEnvelope.getResponse();
        TV.setText(resultString.toString());
    }
    catch (Exception e) {
        e.printStackTrace();
    }

     }
    }

Пожалуйста, помогите мнеееее


person user1338988    schedule 17.04.2012    source источник


Ответы (3)


Ваш код правильный, но может работать только в Android 2. Если вы используете v4 ICS/JB, вы должны использовать AsyncTask.

package com.example.wscall3;

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

import android.app.Activity;
import android.os.AsyncTask;
import android.os.Bundle;
import android.util.Log;

public class MainActivity extends Activity {
    private String TAG ="Vik";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        AsyncCallWS task = new AsyncCallWS();
        task.execute(); 
    }

    private class AsyncCallWS extends AsyncTask<Void, Void, Void> {
        @Override
        protected Void doInBackground(Void... params) {
            Log.i(TAG, "doInBackground");
            calculate();
            return null;
        }

        @Override
        protected void onPostExecute(Void result) {
            Log.i(TAG, "onPostExecute");
        }

        @Override
        protected void onPreExecute() {
            Log.i(TAG, "onPreExecute");
        }

        @Override
        protected void onProgressUpdate(Void... values) {
            Log.i(TAG, "onProgressUpdate");
        }

    }

    public void calculate() 
    {
        String SOAP_ACTION = "http://tempuri.org/CelsiusToFahrenheit";
        String METHOD_NAME = "CelsiusToFahrenheit";
        String NAMESPACE = "http://tempuri.org/";
        String URL = "http://www.w3schools.com/webservices/tempconvert.asmx";

        try { 
            SoapObject Request = new SoapObject(NAMESPACE, METHOD_NAME);
            Request.addProperty("Celsius", "32");

            SoapSerializationEnvelope soapEnvelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);
            soapEnvelope.dotNet = true;
            soapEnvelope.setOutputSoapObject(Request);

            HttpTransportSE transport= new HttpTransportSE(URL);

            transport.call(SOAP_ACTION, soapEnvelope);
            SoapPrimitive resultString = (SoapPrimitive)soapEnvelope.getResponse();

            Log.i(TAG, "Result Celsius: " + resultString);
        }
        catch(Exception ex) {
            Log.e(TAG, "Error: " + ex.getMessage());
        }

        SOAP_ACTION = "http://tempuri.org/FahrenheitToCelsius";
        METHOD_NAME = "FahrenheitToCelsius";
        try { 
            SoapObject Request = new SoapObject(NAMESPACE, METHOD_NAME);
            Request.addProperty("Fahrenheit", "100");

            SoapSerializationEnvelope soapEnvelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);
            soapEnvelope.dotNet = true;
            soapEnvelope.setOutputSoapObject(Request);

            HttpTransportSE transport= new HttpTransportSE(URL);

            transport.call(SOAP_ACTION, soapEnvelope);
            SoapPrimitive resultString = (SoapPrimitive)soapEnvelope.getResponse();

            Log.i(TAG, "Result Fahrenheit: " + resultString);
        }
        catch(Exception ex) {
            Log.e(TAG, "Error: " + ex.getMessage());
        }
    }

}

Мой AndroidManifest.xml:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.wscall3"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk
        android:minSdkVersion="7"
        android:targetSdkVersion="16" />

    <uses-permission android:name="android.permission.INTERNET" />

    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name="com.example.wscall3.MainActivity"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>
person Vik    schedule 11.12.2012

public  String SOAP_ACTION;
public  String METHOD_NAME; 
public  final String WSDL_TARGET_NAMESPACE = "http://tempuri.org/";
public  final String SOAP_ADDRESS =    "http://www.w3schools.com/webservices/tempconvert.asmx";
public  final String WSDL_TARGET_NAMESPACE = "http://tempuri.org/";

/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    input = (EditText) findViewById(R.id.editText1);
    result = (EditText) findViewById(R.id.editText2);

    cel= (RadioButton) findViewById(R.id.radioButton1);
    fah= (RadioButton) findViewById(R.id.radioButton2);

    rGroup = (RadioGroup) findViewById(R.id.rgTemp);

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

    open.setOnClickListener(new View.OnClickListener() {

        public void onClick(View v) {
            Intent openScreen = new Intent("com.loginworks.demo.ANDROIDPLOT");

            startActivity(openScreen);
        }
    });

   rGroup.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener()  {
        public void onCheckedChanged(RadioGroup rGroup, int checkedId)  {

        String in = input.getText().toString();

           if (cel.isChecked()) {
               PROPERTY_NAME = "Fahrenheit";
               METHOD_NAME = "FahrenheitToCelsius";
               SOAP_ACTION  = "http://tempuri.org/FahrenheitToCelsius";                
           }
           else {
               PROPERTY_NAME = "Celsius";
               METHOD_NAME = "CelsiusToFahrenheit";
               SOAP_ACTION  = "http://tempuri.org/CelsiusToFahrenheit";
           }

           Convert(in);

        }            
    });        
}   

public void Convert(String val) {
     SoapObject requestddr = new SoapObject(WSDL_TARGET_NAMESPACE, "Vrati");

     PropertyInfo pi=new PropertyInfo();

        pi.setName(PROPERTY_NAME);
            pi.setValue(val);
            pi.setType(String.class);
            request.addProperty(pi);

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

        envelope.setOutputSoapObject(request);

        HttpTransportSE httpTransport = new HttpTransportSE(SOAP_ADDRESS);

        Object response= null;

        try {

        httpTransport.call(SOAP_ACTION, envelope);
        response = envelope.getResponse();

            }
        catch (Exception exception) {   

            response=exception;                 
            }

        result.setText(response.toString());

http://www.loginworks.com/technical-blogs/258-working-with-soap-web-service-through-android

person markouuu    schedule 03.10.2012

Подключение к сети с сайта developer.android.com:

Сетевые операции могут включать непредсказуемые задержки. Чтобы это не вызывало плохого взаимодействия с пользователем, всегда выполняйте сетевые операции в отдельном потоке из пользовательского интерфейса. Класс AsyncTask предоставляет один из самых простых способов запустить новую задачу из потока пользовательского интерфейса.

Если вы не выполняете сетевые операции (например, httpTransport.call(SOAP_ACTION, soapEnvelope);) в отдельном потоке, вы получите диалог принудительного закрытия ОС Android.

Вы можете использовать AsyncTask, Сервис или IntentService, чтобы сделать это. Написание другого класса, который расширяет один из этих классов для выполнения вызовов веб-службы, решит вашу проблему.

person Kerim Oguzcan Yenidunya    schedule 12.12.2012