我正在尝试运行此应用程序但是当我尝试登录时,我在“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);
}
答案 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)
的内容吗?