2016-10-11 2 views
0

J'essaye d'exécuter cette application mais quand j'essaye de me connecter, je vois cette erreur dans le "logcat". Le message "Success Login" indique qu'il a été connecté et qu'il existe une connexion à la base de données, mais je ne sais pas où attendrait un objet et où est la réception d'une chaîne.Attendu BEGIN_OBJECT mais était STRING à la ligne 1 colonne 1 LoginActivity

10-11 14:54:10.481 2532-7430/com.alvardev.demos.limacultural D/com.alvardev.demos.limacultural.http.RestJsonService: Respuesta data : stdClass Object ([login] => stdClass Object
(
[email] => [email protected]
[password] => 123
))
SELECT id, name, email, urlImg FROM usuario WHERE email='[email protected]' AND password='123'

Notice: Undefined index: password in C:\xampp\htdocs\culturapp\login.php on line 40

Notice: Undefined index: password in C:\xampp\htdocs\culturapp\login.php on line 40
{"success":true,"message":"Success Login","user":{"id":"26","name":"kat","email":"[email protected]","urlImg":""}}

10-11 14:54:10.541 2532-2532/com.alvardev.demos.limacultural E/LoginActivity: error: java.lang.IllegalStateException: Expected BEGIN_OBJECT but was STRING at line 1 column 1

10-11 14:54:10.551 2532-2532/com.alvardev.demos.limacultural E/HttpClient: NO SERVICES

// LoginActivity

btnLogin.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View view) { 
      String user = eteUser.getText().toString(); 
      String pass = etePassword.getText().toString(); 

      if (validateLogin(user, pass)) { 
       RequestLogin login = new RequestLogin(new LoginEntity(user,pass)); 
       layLoading.setVisibility(View.VISIBLE); 
       Gson gson = new Gson(); 
       connectPost(DOMAIN + "login.php", gson.toJson(login), Const.LOGIN); 
      } 

     } 
    }); 

// BaseActionBarActivity

connectPost public void (String url, String JSON, action int) {

Intent intentService = new Intent(this, RestJsonService.class); 


    Bundle parameters = new Bundle(); 
    parameters.putString(RestJsonService.LLAVE_CONTENIDO_PETICION,json); 
    parameters.putParcelable(RestJsonService.LLAVE_RECIBIDOR,resultReceiver); 
    parameters.putInt(RestJsonService.LLAVE_METODO_PETICION, HttpMethod.POST.getValue()); 
    parameters.putString(RestJsonService.LLAVE_URL, url); 
    parameters.putInt(RestJsonService.LLAVE_TIPO_ACCION, action); 

    intentService.putExtras(parameters); 
    startService(intentService); 
} 

// RestJsonService

p onHandleIntent rotected vide (intention Intent) {

Log.d(TAG, "Iniciando servicio"); 
    String url = null; 
    String datos = null; 
    int metodo = 0; 
    int tipoAccion = 0; 
    HttpResult resultado = null; 

    Bundle parametros = intent.getExtras(); 

    url = parametros.getString(LLAVE_URL); 
    datos = parametros.getString(LLAVE_CONTENIDO_PETICION); 
    metodo = parametros.getInt(LLAVE_METODO_PETICION); 
    tipoAccion = parametros.getInt(LLAVE_TIPO_ACCION); 

    Log.d(TAG, "Llamada a la url " + url); 
    Log.d(TAG, "Llamada con datos " + datos); 
    Log.d(TAG, "Llamada metodo " + metodo); 
    Log.d(TAG, "Llamada tipoaccion " + tipoAccion); 

    ResultReceiver recibidor = parametros.getParcelable(LLAVE_RECIBIDOR); 

    HttpMethod metodoEnum = HttpMethod.forValue(metodo); 
    Log.d(TAG, "Llamada " + metodoEnum.toString()); 
    switch (metodoEnum) { 
     case POST: 
      Log.d(TAG, "antes por el post"); 

      resultado = postJson(datos, url); 


      break; 
     case GET: 
      resultado = getJson(url); 
      Log.d(TAG, "paso por el get"); 

      break; 
     default: 
      break; 
    } 
    Log.d(TAG, "Respuesta codigo : " + resultado.getStatusCode()); 

    Log.d(TAG, "Respuesta data : " + resultado.getData()); 

    Bundle datosResultado = new Bundle(); 
    datosResultado 
      .putString(LLAVE_CONTENIDO_RESPUESTA, resultado.getData()); 
    datosResultado.putInt(LLAVE_TIPO_ACCION, tipoAccion); 

    recibidor.send(resultado.getStatusCode(), datosResultado); 
    //recibidor = null; 
} 

HttpResult privé postJson (String bodyRequest, String url) {

HttpPost httpPost = new HttpPost(url); 
    HttpParams httpParams = new BasicHttpParams(); 
    HttpConnectionParams.setConnectionTimeout(httpParams, 30000); 
    HttpConnectionParams.setSoTimeout(httpParams, 30000); 
    HttpClient httpClient = new DefaultHttpClient(httpParams); 

    String data = null; 
    int status = 0; 

    StringEntity se; 
    try { 
     se = new StringEntity(bodyRequest, "UTF8"); 
     se.setContentType(new BasicHeader(HTTP.CONTENT_TYPE, "text/json")); 
     Log.d(TAG, "text/json"); 
     httpPost.setEntity(se); 



     HttpResponse response = httpClient.execute(httpPost); 
     status = response.getStatusLine().getStatusCode(); 

     HttpEntity entity = response.getEntity(); 
     String respuesta = EntityUtils.toString(entity); 
     data = respuesta; 

    } catch (ClientProtocolException e) { 
     status = HttpCode.ERROR.getCode(); 
     Log.e(TAG, "Error protocolo"); 
     Log.e(TAG, getErrorMessage(e, "Error al realizar la peticion")); 
    } catch (IOException e) { 
     Log.e(TAG, "Error timeout"); 
     Log.e(TAG, getErrorMessage(e, "Timeout sucedio")); 
     status = HttpCode.TIMEOUT.getCode(); 
    } catch (Exception e) { 
     Log.e(TAG, "Error general"); 

     Log.e(TAG, 
       getErrorMessage(e, 
         "Error generico sucedio al realizar la petici�n")); 
     status = HttpCode.ERROR.getCode(); 
    } 

    return new HttpResult(data, status); 
} 

Répondre

1

Ici vous avez l'échantillon de la mauvaise mise en œuvre de api côté serveur. En fait, si api répond avec json, il doit toujours répondre avec json. Quant à moi, c'est une mauvaise habitude d'envoyer une chaîne de temps et une autre - sérialisé json.

bonne pratique pour moi est tout répond comme:

{"success":true, "data": "some data object optional"} 
{"success":false, "error":{"errorCode":123, "errorMessage":"some error text"}, data:"some additional data object optional"} 

pour être sûr que vous avez répondre une bonne hmac signature de la demande pourrait être mise en œuvre - de sorte que vous vérifiera et désérialiser que si hmac signe est correct, être bien sûr répondre est ok et vous avez votre json. Coz sans vérifier vous n'êtes pas sûr de ce que vous avez, vous pouvez obtenir le texte d'erreur sous forme de chaîne à partir du serveur et vous allez essayer de le désérialiser avec Gson.

de toute façon, vous pouvez prendre tout avec try/catch mais surtout est bonne façon décrite)

0

L'erreur vient de Gson, lorsque vous essayez d'analyser la réponse à une chaîne JSON. C'est une erreur typique quand la chaîne fournie n'est pas un JSON valide, mais une chaîne normale. L'erreur vient de cette partie, probablement:

Gson gson = new Gson(); 
connectPost(DOMAIN + "login.php", gson.toJson(login), Const.LOGIN); 

Vous essayez de convertir en JSON l'objet login:

  RequestLogin login = new RequestLogin(new LoginEntity(user,pass)); 

Et la représentation de chaîne de cet objet n'est pas un JSON. Vous ne partagez pas le code de la classe RequestLogin - mais essayez de modifier votre code pour fournir un JSON valide à Gson. Ce que vous fournissez maintenant est la sortie toString() de la classe RequestLogin - qui n'est pas un JSON valide. Pouvez-vous partager le contenu de gson.toJson(login)?