Не подключается к Android KSOAP Webservice

У меня есть веб-сервис на моем localhost который имеет простой метод для подключения к базе данных, а также возвращает названия городов в массиве строк.

Вот ссылка, когда я запускаю свой сервис:

http://localhost:1543/Service1.asmx

Я пытаюсь подключиться к этому веб-сервису через приложение Android, но думаю, что не выбираю namespace или же soapaction и так далее правильно, поэтому я получаю следующее исключение.

ожидается: START_TAG { http://schemas.xmlsoap.org/soap/envelope/} Конверт (позиция:START_TAG @2:7 в java.io.InputStreamReader@41387778)

Вот мой код Android:

    public class ProvinceCityActivity extends Activity
{
    EditText txtProvince;
    Button btnResult;

    private static String SOAP_ACTION = "http://tempuri.org/GetCities";

    private static String NAMESPACE = "http://tempuri.org/";
    private static String METHOD_NAME = "GetCities";

    private static String URL = "http://192.168.0.109:1543/Service1.asmx";

    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        txtProvince = (EditText) findViewById(R.id.txtProvince);
        btnResult = (Button) findViewById(R.id.btnResult);
        btnResult.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View v) {

                SoapObject request = new SoapObject(NAMESPACE, METHOD_NAME);
                request.addProperty("value", txtProvince.getText().toString());
                SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(
                        SoapEnvelope.VER11);
                envelope.setOutputSoapObject(request);
                envelope.dotNet = true;


                try
                {
                    HttpTransportSE androidHttpTransport = new HttpTransportSE(
                            URL);
                    androidHttpTransport.call(SOAP_ACTION, envelope);


                    SoapObject result = (SoapObject) envelope.bodyIn;
                    if (result != null)
                    {
                        String[] strResult = (String[]) result.getProperty(0);
                    Toast.makeText(getApplicationContext(),
                            "Cities: " + strResult[0], 6000).show();
                    }
                } catch (Exception e)
                {
                    Toast.makeText(getApplicationContext(),
                            e.getMessage().toString(), 6000).show();
                }

            }
        });

    }
}

Logcat:

05-15 05:10:07.651: D/dalvikvm(632): GC_CONCURRENT freed 101K, 78% free 462K/2048K, paused 1ms+1ms
05-15 05:10:07.661: D/dalvikvm(632): Debugger has detached; object registry had 1 entries
05-15 05:10:07.671: I/AndroidRuntime(632): NOTE: attach of thread 'Binder Thread #3' failed
05-15 05:10:08.252: D/AndroidRuntime(645): >>>>>> AndroidRuntime START com.android.internal.os.RuntimeInit <<<<<<
05-15 05:10:08.252: D/AndroidRuntime(645): CheckJNI is ON
05-15 05:10:09.132: D/AndroidRuntime(645): Calling main entry com.android.commands.am.Am
05-15 05:10:09.161: I/ActivityManager(73): START {act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] flg=0x10000000 cmp=soleimannezhad.android.wCFProvinceCity/.Sohsession13WCFProvinceCityActivity} from pid 645
05-15 05:10:09.171: W/WindowManager(73): Failure taking screenshot for (180x300) to layer 21005
05-15 05:10:09.211: W/NetworkManagementSocketTagger(73): setKernelCountSet(10047, 1) failed with errno -2
05-15 05:10:09.221: D/AndroidRuntime(645): Shutting down VM
05-15 05:10:09.241: D/dalvikvm(645): GC_CONCURRENT freed 102K, 77% free 483K/2048K, paused 2ms+1ms
05-15 05:10:09.241: D/dalvikvm(645): Debugger has detached; object registry had 1 entries
05-15 05:10:09.271: I/AndroidRuntime(645): NOTE: attach of thread 'Binder Thread #3' failed
05-15 05:10:09.751: V/PhoneStatusBar(141): setLightsOn(true)
05-15 05:10:10.191: V/PhoneStatusBar(141): setLightsOn(true)
05-15 05:10:10.321: I/ActivityManager(73): Displayed soleimannezhad.android.wCFProvinceCity/.Sohsession13WCFProvinceCityActivity: +1s115ms
05-15 05:10:10.631: D/dalvikvm(73): GC_CONCURRENT freed 489K, 6% free 12719K/13447K, paused 5ms+54ms
05-15 05:10:10.782: W/NetworkManagementSocketTagger(73): setKernelCountSet(10004, 0) failed with errno -2

5 ответов

Вы отлаживаете свое приложение с эмулятора Android? Если это так, вы должны начать свой URL с "http:// 10.0.2.2", чтобы эмулятор мог подключиться к вашему локальному веб-сервису...

Смотрите изображение здесь

SOAP_ACTION: это ваше NAMESPACE/METHOD_NAME, например, " http://ws.android4.com/ "

METHOD_NAME: это название метода, например: "sayHello"

NAMESPACE: Это ваш NameSapce, например: " http://ws.android4.com/ "

Для примера веб-сервиса см. Этот веб-сервис w3schools

Вот,

METHOD_NAME: CelsiusToFahrenheit

SOAPAction: http://www.w3schools.com/webservices/CelsiusToFahrenheit

NAMESPACE: http://www.w3schools.com/webservices/

Добавьте интернет-разрешение в файл Androidanifest.xml.

package com.example.WSTest;

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.widget.Button;

import android.widget.EditText;

import android.widget.Toast;

//import android.widget.SlidingDrawer;;

public class WSTestActivity extends Activity {

    private static final String SOAP_ACTION = "http://MVIndia.com/AddActivity";
    private static final String METHOD_NAME = "AddActivity";
    private static final String NAMESPACE = "http://MVIndia.com/";
    private static final String URL = "http://10.0.2.2/SAP/Service.asmx";

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

        //final SlidingDrawer txt1 = (SlidingDrawer) findViewById(R.id.Spinner1);
        //final SlidingDrawer txt2 = (SlidingDrawer) findViewById(R.id.Spinner2);
        final EditText txt3 = (EditText) findViewById(R.id.editText3);
        final EditText txt4 = (EditText) findViewById(R.id.editText4);
        final EditText txt5 = (EditText) findViewById(R.id.editText5);
        final EditText txt6 = (EditText) findViewById(R.id.editText6);
        final EditText txt7 = (EditText) findViewById(R.id.editText7);
        final EditText txt8 = (EditText) findViewById(R.id.editText8);
        //final SlidingDrawer txt9 = (SlidingDrawer) findViewById(R.id.Spinner3);
        final EditText txt10 = (EditText) findViewById(R.id.editText10);

        Button button = (Button) findViewById(R.id.btnActivity);
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                //SoapObject request = new SoapObject(NAMESPACE, METHOD_NAME);
                SoapObject req_AddActivity = new SoapObject(NAMESPACE, METHOD_NAME);
                req_AddActivity.addProperty("strActivity", "");
                req_AddActivity.addProperty("strActivityType", "");
                req_AddActivity.addProperty("strAssignedTo", txt3.getText().toString());
                req_AddActivity.addProperty("strBPCode", txt4.getText().toString());
                req_AddActivity.addProperty("strBPName", txt5.getText().toString());
                req_AddActivity.addProperty("strActivityDate", txt6.getText().toString());
                req_AddActivity.addProperty("strContactPerson", txt7.getText().toString());
                req_AddActivity.addProperty("strEndDate", txt8.getText().toString());
                req_AddActivity.addProperty("strProgress", "");
                req_AddActivity.addProperty("strRemarks", txt10.getText().toString());

                SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);
                envelope.dotNet = true; 
                envelope.setOutputSoapObject(req_AddActivity);
                HttpTransportSE  androidHttpTransport = new HttpTransportSE (URL);      
                try {
                    androidHttpTransport.call(SOAP_ACTION, envelope);
                    Object result = envelope.getResponse();
                    //if (result.toString()=="True")
                    //{
                        //Toast.makeText(WSTestActivity.this, "Activity added Successfully.", Toast.LENGTH_SHORT).show(); 
                    //}
                   Toast.makeText(WSTestActivity.this, result.toString(), Toast.LENGTH_SHORT).show();  
                    //((TextView)findViewById(R.id.lblStatus)).setText(result.toString());
                } catch(Exception E) {
                    Toast.makeText(WSTestActivity.this, E.getClass().getName() + ": " + E.getMessage(), Toast.LENGTH_SHORT).show(); 
                    //((TextView)findViewById(R.id.lblStatus)).setText("ERROR:" + E.getClass().getName() + ": " + E.getMessage());
                }
                //Toast.makeText(WSTestActivity.this, "Caught", Toast.LENGTH_SHORT).show();  
            }
        });
    }
}

Попробуйте это Это работает на моей локальной машине. Веб-сервис возвращает true, если действие добавлено успешно. Я надеюсь, что это поможет вам.

Я выложу там свое исправление... Я сталкивался с этим несколько раз, и каждый раз в прошлом это было действие, метод или URL. Однако на этот раз это был странный URL...

Я прохожу какой-то прокси для текущего проекта. По некоторым причинам, URL чувствителен к регистру.

https://abc.gov/webservice/webservice.asmx работает

https://abc.gov/WEBSERVICE/webservice.asmx НЕ работает

Надеюсь, это поможет некоторым.

Эта ошибка возникает, когда вы не указали правильный URL. Проверьте URL-адрес, имя метода и действие мыла веб-службы, в которой вы разместили веб-службу. Хорошей практикой является использование фоновых сервисов, таких как AsyncTask, для вызова веб-сервисов.

Другие вопросы по тегам