JSON Cadena devuelta desde el servicio web SOAP que no contiene registros para la tabla
Tengo un servicio web SOAP (.asmx) implementado utilizando el marco .NET que me devuelve una cadena JSON de esta forma:
{"Checkrecord": [{"rollno": "abc2", "porcentaje": 40, "asistido": 12, "perdido": 34}], "Tabla1": []}
Ahora en mi aplicación de Android estoy usando ksoap para llamar al servicio web de la siguiente manera:
public String getjsondata(String b) { String be=""; SoapObject request = new SoapObject(namespace, method_NAME); request.addProperty("rollno",b); SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11); envelope.dotNet = true; envelope.setOutputSoapObject(request); HttpTransportSE android = new HttpTransportSE(url); android.debug = true; try { //android.setXmlVersionTag("<?xml version=\"1.0\" encoding=\"UTF-8\"?>"); android.call(soap_ACTION, envelope); SoapPrimitive result = (SoapPrimitive)envelope.getResponse(); Log.i("myapp",result.toString()); System.out.println(" --- response ---- " + result); be=result.toString(); if (be.startsWith("[")) { // if JSON string is an array JSONArr = new JSONArray(be); System.out.println("length" + JSONArr.length()); for (int i = 0; i < JSONArr.length(); i++) { JSONObj = (JSONObject) JSONArr.get(i); bundleResult.putString(String.valueOf(i), JSONObj.toString()); System.out.println("bundle result is"+bundleResult); } } } catch (SocketException ex) { ex.printStackTrace(); } catch (Exception e) { e.printStackTrace(); } return be; }
Estoy recibiendo una respuesta, pero la respuesta no contiene ningún registro y muestra valores en blanco.
Aquí está la respuesta de Logcat:
11-21 20:13:03.283: INFO/myapp(1173): {"checkrecord":[],"Table1":[]} 11-21 20:13:03.283: INFO/System.out(1173): --- response ---- {"checkrecord":[],"Table1":[]}
¿Puede alguien decirme por qué está sucediendo esto?
Mi código de servicio web:
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 returnjson { /// <summary> /// Summary description for Service1 /// </summary> [WebService(Namespace = "http://tempuri.org/")] [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)] [ToolboxItem(false)] // To allow this Web Service to be called from script, using ASP.NET AJAX, uncomment the following line. // [System.Web.Script.Services.ScriptService] public class Service1 : System.Web.Services.WebService { [WebMethod] public String getdata(String rollno) { String json; try { using (SqlConnection myConnection = new SqlConnection(@"Data Source=.\SQLEXPRESS;Initial Catalog=student;User ID=sa;Password=123")) { string select = "select * from checkrecord where rollno=\'" + rollno + "\'"; SqlDataAdapter da = new SqlDataAdapter(select, myConnection); DataSet ds = new DataSet(); da.Fill(ds, "checkrecord"); DataTable dt = new DataTable(); ds.Tables.Add(dt); json = Newtonsoft.Json.JsonConvert.SerializeObject(ds); } } catch (Exception ex) { Console.WriteLine(ex.Message); return null; } return json; } } }
Edit: He probado mi código de servicio web utilizando una aplicación cliente en .NET y está funcionando bien .. obtener una respuesta adecuada como devuelto JSON cadena con todos los registros y valores.
- Introduce datos en la base de datos desde la aplicación de Android a través del servicio web.
- ProgressDialog o ProgressBar ralentiza la aplicación que ejecuta Android 4.1
- No se puede llamar a REST API en android
- Pase y reciba el objeto JSON de Jersey Resftul webservice desde android
- Bloquear usuarios no Android que llaman al servicio JSON
- Consumir el servicio web de WCF desde la aplicación Android?
- ¿La mejor práctica para implementar retroalimentación de retorno a la actividad recreada?
- No se pueden serializar las fechas con ksoap2
Parece que este problema se relaciona con algún símbolo específico como: \ lead al error de análisis de jabón.
Usted puede utilizar alguna herramienta como Ethereal para analizar el flujo de entrada y asegúrese de haber recibido correctamente. Si es correcto, puede ser que usted debe codificar datos json y luego enviarlo.
Sólo lo pruebo en mi servidor (lámpara) que devuelven un JSONObject en el cuerpo, y el uso de Android a continuación del código, el trabajo normalmente:
public static void testApi() { AndroidHttpTransport androidHttptt = new AndroidHttpTransport("http://172.16.0.178/1mobile/market/services.php"); SoapObject request = new SoapObject(NAMESPACE, "check_error"); // request.addProperty("data", "empty"); SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11); Element[] header = new Element[1]; header[0] = new Element().createElement(NAMESPACE, "Credentials"); envelope.dotNet = true; envelope.headerOut = header; envelope.setOutputSoapObject(request); AndroidHttpTransport androidHttpTransport = new AndroidHttpTransport(url); androidHttpTransport.setXmlVersionTag(XML_HEAD); try { androidHttptt.call("http://172.16.0.178/check_error", envelope); SoapObject response = (SoapObject) envelope.getResponse(); Log.e("response", "response=" + response.toString()); } catch (Exception e) { } }
Con Etheral, consigo los datos como esto:
<?xml version="1.0" encoding="UTF-8"?> <SOAP-ENV:Envelope SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/"> <SOAP-ENV:Body> <ns1:check_errorResponse xmlns:ns1="http://test.test.com"> <Result xsi:type="xsd:string">{"checkrecord":[{"rollno":"abc2","percentage":40,"attended":12,"missed":34}],"Table1":[]}</Result> </ns1:check_errorResponse> </SOAP-ENV:Body> </SOAP-ENV:Envelope>
Usted puede encontrar los datos json se han convertido a
{"checkrecord":[{"rollno":"abc2","percentage":40,"attended":12,"missed":34}],"Table1":[]}
El protocolo SOAP utiliza XML como medio de comunicación. Su solicitud se convertirá en una cadena XML y la respuesta del servidor será una cadena XML que el KSOap analiza y le proporciona un objeto. Así que parece que la respuesta de WebService está bien, pero hay un problema con el análisis de KSoap. Así que como ustedes estaban discutiendo, puede codificar la cadena en el servidor y devolverla. Android ya proporciona soporte para la codificación / decodificación de Base64.
En el servicio web devuelve lo siguiente en lugar de json.
Convert.ToBase64String (Encoding.UTF8.GetBytes (json));
Esto le devolverá una cadena codificada. Así que la respuesta que obtendrá será una cadena codificada. Así que en el lado del cliente de Android.
new String(android.util.Base64.decode(responseString.getBytes(),android.util.Base64.DEFAULT))
Que le dará u la cadena decodificada. Espero que ayuda
- Descargar el archivo apk de S3 con DownloadManager
- Algunos dispositivos Android extremadamente lentos al representar elementos de lienzo