预计BEGIN_OBJECT但在STRING第1列第1列LoginActivity

时间:2016-10-11 21:57:23

标签: android json web-services login logcat

我正在尝试运行此应用程序但是当我尝试登录时,我在“logcat”中看到了这个错误。消息“成功登录”表示它已被记录,并且存在与数据库的连接,但我不知道在哪里等待对象以及接收字符串的位置。

  

10-11 14:54:10.481 2532-7430 / com.alvardev.demos.limacultural   D / com.alvardev.demos.limacultural.http.RestJsonService:Respuesta数据   :stdClass对象([login] => stdClass对象
  (
  [email] => kat@e.com
  [密码] => 123个
  ))
  SELECT id,name,email,urlImg FROM usuario WHERE email='kat@e.com'   AND password ='123'

  注意:未定义的索引:密码在   在 40 C:\ xampp \ htdocs \ culturapp \ login.php

  注意:未定义的索引:密码在   在 40 C:\ xampp \ htdocs \ culturapp \ login.php 上                                                                                                                        {“成功”:真实的,“消息”:“成功   登录”, “用户”:{ “ID”: “26”, “名称”: “吉”, “电子邮件”: “kat@e.com”, “urlImg”: “”}}

     

10-11 14:54:10.541 2532-2532 / com.alvardev.demos.limacultural   E / LoginActivity:错误:java.lang.IllegalStateException:预期   BEGIN_OBJECT但在第1行第1列STRING

     

10-11 14:54:10.551 2532-2532 / com.alvardev.demos.limacultural   E / HttpClient:无服务

// 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

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

    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

protected void onHandleIntent(Intent 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;
}

private HttpResult 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);
}

2 个答案:

答案 0 :(得分:1)

这里有一些服务器端api执行不良的示例。 实际上,如果api以json回复,则必须始终以json回复。至于我,发送一个字符串和另一个字符串是不好的做法 - 序列化json

对我而言,良好的做法都是如下:

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

确保您得到了正确的回复hmac请求签名可以实施 - 因此只有在hmac符号正确时才会检查和反序列化,以确保回复正常并且您获得了{{ 1}}。 Coz没有检查你不确定你得到了什么,你可以从服务器获得错误文本作为字符串,你将尝试用json反序列化它。

无论如何,你可以用Gson捕获所有内容,但上面描述了正确的方法)

答案 1 :(得分:0)

当您尝试将字符串响应解析为JSON时,错误来自Gson。当提供的字符串不是有效的JSON,而是普通的字符串时,这是一个典型的错误。错误来自这部分,可能是:

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

您正试图将login对象转换为JSON:

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

该对象的String表示形式不是JSON。您没有共享RequestLogin类的代码 - 但尝试修改代码以向Gson提供有效的JSON。您现在提供的是RequestLogin类的toString()输出 - 它不是有效的JSON。

您可以分享gson.toJson(login)的内容吗?