Intereting Posts
Android – Присутствие Smack и функции «набирает» не работают Как создать собственный менеджер загрузок в android 2.2 Как определить размер Android View в пикселях? Как рассчитать точное количество шагов ноги с помощью акселерометра в android? Android: используйте UUID в качестве первичного ключа в SQLite OpenGLES на Android – IllegalStateException: setRenderer уже вызван для этого экземпляра Волейбол не вызывает getParams для моего пользовательского запроса? Есть ли API для * изменения * значений Firebase Remote Config? AVD недействителен. Конфигурация изменилась с момента создания AVD в Intellij IDEA 13 Android: обратное геокодирование – getFromLocation Android. Как разместить позиции в смещении относительно центра / верхнего / нижнего (и т. Д.) Их родителя? Combobox в Android Как нарисовать круг, прямоугольник вручную на видеоролике Android Пользовательская синхронизация не работает с учетной записью Google (com.google) на некоторых устройствах Samsung Если активность убита, работает ли AsyncTask?

Как вызвать локальный веб-сервис из мобильного приложения Android

За последние несколько дней я работал над кодом Android для вызова локального веб-сервиса. Я использую библиотеки ksoap для Android для вызова моего веб-сервиса SOAP, созданного в .NET. Тем не менее, я чувствую, что в моем коде есть что-то не так, как ответ, который я получаю, когда я вызываю веб-службу из своего приложения, попадает в блок catch. Я попытался отладить мой код Android, но я все еще не могу решить свою проблему. Пожалуйста, может кто-нибудь сказать мне, что не так или какой-либо другой более простой способ сделать это?

Вот мой Android-код, который я реализовал до сих пор:

package com.demo; import java.net.SocketException; import org.ksoap2.SoapEnvelope; import org.ksoap2.serialization.SoapObject; import org.ksoap2.serialization.SoapPrimitive; import org.ksoap2.serialization.SoapSerializationEnvelope; import org.ksoap2.transport.AndroidHttpTransport; import android.app.Activity; import android.app.ProgressDialog; import android.os.AsyncTask; import android.os.Bundle; import android.util.Log; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.EditText; public class Login extends Activity { private static final String SOAP_ACTION = "http://tempuri.org/GetLoginDetails"; private static final String METHOD_NAME = "GetLoginDetails"; private static final String NAMESPACE = "http://tempuri.org/"; private static final String URL = "http://10.0.2.2/testlogin/Service1.asmx"; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); Button signin = (Button) findViewById(R.id.regsubmitbtn); signin.setOnClickListener(new OnClickListener() { public void onClick(View v) { EditText etxt_user = (EditText) findViewById(R.id.usereditlog); user_id = etxt_user.getText().toString(); EditText etxt_password = (EditText) findViewById(R.id.pwdeditlog); password = etxt_password.getText().toString(); new LoginTask().execute(); } }); } String user_id; String password; String auth=null; private class LoginTask extends AsyncTask<Void, Void, Void> { private final ProgressDialog dialog = new ProgressDialog( Login.this); protected void onPreExecute() { this.dialog.setMessage("Logging in..."); this.dialog.show(); } protected Void doInBackground(final Void... unused) { auth = doLogin("lalit", "lalit"); return null; // don't interact with the ui! } protected void onPostExecute(Void result) { if (this.dialog.isShowing()) { this.dialog.dismiss(); } } private String doLogin(String user_id, String password) { SoapPrimitive resultstring = null; SoapObject request = new SoapObject(NAMESPACE, METHOD_NAME); request.addProperty("user", user_id); request.addProperty("password", password); SoapSerializationEnvelope soapenvelope = new SoapSerializationEnvelope( SoapEnvelope.VER11); soapenvelope.dotNet = true; soapenvelope.setOutputSoapObject(request); AndroidHttpTransport httptransport = new AndroidHttpTransport(URL); httptransport.debug = true; try { httptransport.call(SOAP_ACTION, soapenvelope); resultstring = (SoapPrimitive) soapenvelope.getResponse(); //Log.d("Authenticaion", resultstring+""); System.out.println(resultstring); } catch (SocketException ex) { Log.e("Error : " , "Error on soapPrimitiveData() " + ex.getMessage()); ex.printStackTrace(); } catch (Exception e) { Log.e("Error : " , "Error on soapPrimitiveData() " + e.getMessage()); e.printStackTrace(); } return resultstring+""; } } } 

Мой код веб-сервиса:

  using System; using System.Collections; using System.ComponentModel; using System.Data; using System.Linq; using System.Web; using System.Web.Services; using System.Web.Services.Protocols; using System.Xml.Linq; using System.Data.SqlClient; namespace LoginDetails { [WebService(Namespace = "http://tempuri.org/")] [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)] [ToolboxItem(false)] // [System.Web.Script.Services.ScriptService] public class Service1 : System.Web.Services.WebService { [WebMethod] public String GetLoginDetails(string UserName, string Password) { try { using (SqlConnection myConnection = new SqlConnection(@"Data Source= .\SQLEXPRESS;Initial Catalog=student;User ID=sa;Password=demo")) { myConnection.Open(); using (SqlCommand myCommand = new SqlCommand()) { myCommand.Connection = myConnection; myCommand.CommandText = "SELECT COUNT(*) FROM Login WHERE UserName = @UserName AND Password = @Password"; myCommand.Parameters.Add("@UserName", SqlDbType.VarChar).Value = UserName; myCommand.Parameters.Add("@Password", SqlDbType.VarChar).Value = Password; return (int)myCommand.ExecuteScalar() == 1 ? "success" : "bad username or password"; } } } catch (Exception ex) { Console.WriteLine(ex.Message); return "an error occurred."; } } } } 

Мой логарифм:

  10-22 21:49:17.635: DEBUG/dalvikvm(117): GC_EXTERNAL_ALLOC freed 901 objects / 10-22 21:49:18.015: WARN/KeyCharacterMap(117): No keyboard for id 0 10-22 21:49:18.015: WARN/KeyCharacterMap(117): Using default keymap: /system/usr/keychars/qwerty.kcm.bin 10-22 21:49:22.275: INFO/ARMAssembler(58): generated s scanline__00000077:03515104_00000000_00000000 [ 33 ipp] (47 ins) at [0x23df98:0x23e054] in 675711 ns 10-22 21:49:42.025: INFO/System.out(274): an error occurred. 10-22 21:49:42.045: WARN/InputManagerService(58): Window already focused, ignoring focus gain of: com.android.internal.view.IInputMethodClient$Stub$Proxy@44eda178 

Мой вывод во время вызова веб-службы

Solutions Collecting From Web of "Как вызвать локальный веб-сервис из мобильного приложения Android"

Работа с kSOAP2 может быть сложной … я знаю. Но это хорошая библиотека, и я смог заставить ее работать. Я немного написал о работе с kSOAP2 на Android. Я обсуждаю прохождение простых и сложных параметров, прием массивов и работу с объектами JDBC WebRowSet по проводке.

http://roderickbarnes.com/blog/droid-chronicles-web-services-handling-complex-parameters

Есть другие статьи в блогах по работе с kSOAP2 на сайте. Надеюсь, это поможет.

Как-то мне удалось решить мою проблему, и я отвечаю на этот вопрос, чтобы он был полезен людям, которые видят этот пост в будущем.

Итак, вот модифицированный код:

  package com.demo; import java.net.SocketException; 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.app.ProgressDialog; import android.os.AsyncTask; import android.os.Bundle; import android.util.Log; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.EditText; public class Login extends Activity { private final String NAMESPACE = "http://tempuri.org/"; private final String URL = "http://10.0.2.2/testlogin/Service1.asmx"; String user_id; String password; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); Button signin = (Button) findViewById(R.id.regsubmitbtn); signin.setOnClickListener(new OnClickListener() { public void onClick(View v) { EditText etxt_user = (EditText) findViewById(R.id.usereditlog); user_id = etxt_user.getText().toString(); EditText etxt_password = (EditText) findViewById(R.id.pwdeditlog); password = etxt_password.getText().toString(); new LoginTask().execute(); } }); } private boolean doLogin(String user_id, String password) { boolean result=false; final String SOAP_ACTION = "http://tempuri.org/GetLogin"; final String METHOD_NAME = "GetLogin"; SoapObject request = new SoapObject(NAMESPACE, METHOD_NAME); request.addProperty("userid", user_id); request.addProperty("password",password); SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11); envelope.dotNet = true; // Set this variable to true for // compatibility with what seems to be the // default encoding for .Net-Services. envelope.setOutputSoapObject(request); System.out.println(request); HttpTransportSE androidHttpTransport = new HttpTransportSE(URL); try { androidHttpTransport.call(SOAP_ACTION, envelope); SoapPrimitive response = (SoapPrimitive)envelope.getResponse(); Log.i("myApp", response.toString()); System.out.println("response" +response); if(response.toString().equalsIgnoreCase("success")) { result = true; } }catch(SocketException ex) { Log.e("Error : " , "Error on soapPrimitiveData() " + ex.getMessage()); ex.printStackTrace(); } catch (Exception e) { Log.e("Error : " , "Error on soapPrimitiveData() " + e.getMessage()); e.printStackTrace(); } return result; } private class LoginTask extends AsyncTask<Void, Void, Void> { private final ProgressDialog dialog = new ProgressDialog( Login.this); protected void onPreExecute() { this.dialog.setMessage("Logging in..."); this.dialog.show(); } protected Void doInBackground(final Void... unused) { boolean auth=doLogin(user_id,password); System.out.println(auth); return null;// don't interact with the ui! } protected void onPostExecute(Void result) { if (this.dialog.isShowing()) { this.dialog.dismiss(); } } } }