Не подключается к 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, для вызова веб-сервисов.