【问题标题】:Volley and Gson -Sending a POST request using JSONObjectRequestVolley 和 Gson - 使用 JSONObjectRequest 发送 POST 请求
【发布时间】:2015-08-10 08:50:14
【问题描述】:

我是新来的,英语说得不太好,但我会尽力解释。 我对 Post 请求有一些问题。这是我的代码:

private void makeRequest() {
    String url = "http://diegocardenas.netau.net/comprobar_usuario.php";


    JsonObjectRequest request1=new JsonObjectRequest(Method.POST, url, new Response.Listener<JSONObject>() {
        @Override
        public void onResponse(JSONObject response) {
            onConnectionFinished();
            Usuario usuario = new Gson().fromJson(response.toString(), Usuario.class);
            if (usuario != null) {
                Log.i("App1", "Nombre:" + usuario.getNombre() + " Correo: " + usuario.getCorreo());
            }
        }
    }, new Response.ErrorListener() {
        @Override
        public void onErrorResponse(VolleyError error) {
            onConnectionFailed(error.toString());
            Log.i("App1", error.getMessage());
        }
    }){
        @Override
        protected Map<String, String> getParams() throws AuthFailureError {
            Map<String,String> params=new HashMap<>();
            params.put("correo","daniel@gmail.com");
            params.put("clave","daniel");
            return params;
        }
    };
    addToQueue(request1);
}

这是 Usuario 类:

public class Usuario {
    private int cod_usuario, contador, estado;
    private String nombre, correo;

    public Usuario() {
    }

    public int getCod_usuario() {
        return cod_usuario;
    }

    public void setCod_usuario(int cod_usuario) {
        this.cod_usuario = cod_usuario;
    }

    public int getContador() {
        return contador;
    }

    public void setContador(int contador) {
        this.contador = contador;
    }

    public String getNombre() {
        return nombre;
    }

    public void setNombre(String nombre) {
        this.nombre = nombre;
    }

    public String getCorreo() {
        return correo;
    }

    public void setCorreo(String correo) {
        this.correo = correo;
    }

    public int getEstado() {
        return estado;
    }

    public void setEstado(int estado) {
        this.estado = estado;
    }
}

还有我的 PHP……抱歉,我是 PHP 的初学者

comprobar_usuario.php

<?php
header('Content-Type: text/html; charset=UTF-8');
include_once('usuario.class.php');
$usuario=new Usuario();
$correo=$_POST['correo'];
$clave=$_POST['clave'];
echo json_encode($usuario->getJSONUsuario($correo,$clave));
?>

usuario.class.php

<?php
include_once('database.class.php');
class Usuario{
public function getJSONUsuario($correo,$clave){
        $json= array();
        $result=$this->comprobarUsuario($correo,$clave);
        if(mysql_num_rows($result)){
            while ($row=mysql_fetch_row($result)) {
                $json[]=array('nombre'=>$row[1], 'correo'=>$row[2],
                    'contador'=>$row[5]);
            }
        }
        return $json;
}
    private function comprobarUsuario($correo, $clave){
        $consulta="SELECT * FROM usuario WHERE correo='".$correo."' 
            AND clave='".$clave."'";
        $db=new Database();
        return $db->ejecutarConsulta($consulta);
    }
}
?>

数据库.class.php

<?php
include_once('datos_conexion.class.php');

class Database{

    public function ejecutarConsulta($consulta){
        $conexion=mysql_connect(DatosConexion::getServidor(), DatosConexion::getUsuarioConexion(),
            DatosConexion::getClaveConexion());
        mysql_set_charset('utf8',$conexion);
        if(!$conexion){
            die('No se pudo conectar al servidor: '.mysql_error());
        }else{
            mysql_select_db(DatosConexion::getDataBase(),$conexion);
            $resultado=mysql_query($consulta);
            mysql_close();
            return $resultado;
        }
    }
}
?>

桌子:Usuario 字段:cod_usuario Int, nombre Varchar, correo Varchar, clave Varchar, estado Boolean, contador Int

已编辑 日志:

05-28 09:52:02.921 10862-11210/com.diego.app1I/qtaguid﹕ Failed write_ctrl(u 67) res=-1 errno=22 
05-28 09:52:02.921 10862-11210/com.diego.app1I/qtaguid﹕ Untagging socket 67 failed errno=-22 
05-28 09:52:02.921 10862-11210/com.diego.app1W/NetworkManagementSocketTagger﹕ untagSocket(67) failed with errno -22 
05-28 09:52:02.921 10862-10862/com.diego.app1 I/App1﹕ org.json.JSONException: Value [] of type org.json.JSONArray cannot be converted to JSONObject

我使用 GET 证明了连接并返回了数据,但是当使用 POST 失败时,所有 xD 我认为问题在于getparams方法...

请帮忙!!!!

【问题讨论】:

  • 你能给我们看错误日志吗?

标签: android post request gson android-volley


【解决方案1】:

如果您认为问题出在 getParams 上,那么使用 Volley 您不必使用 getParams,它知道如何处理 JSONObject,因此您可以使用:

  String someurl = URL;

    Map<String, Object> jsonParams = new HashMap<>();
    jsonParams.put("someparam", getSomeParam());

    JsonObjectRequest request = new JsonObjectRequest(Request.Method.POST, someurl, new JSONObject(jsonParams),
            new Response.Listener<JSONObject>()
            {
                @Override
                public void onResponse(JSONObject response)
                {
                    Log.d(TAG + ": ", "Response: " + response.toString());
                    //do other stuff 
                }
            },
            new Response.ErrorListener()
            {
                @Override
                public void onErrorResponse(VolleyError error)
                {
                    if (null != error.networkResponse)
                    {
                        Log.d(TAG + ": ", "Error Response code: " + error.networkResponse.statusCode);
                    }
                }
            });

    requestQueue.add(request);

另外 - 确保 Usuario 类中的变量名称与您在 Json 中返回的名称匹配,如果不匹配,则 Usuario 中的变量默认为 NULL。

【讨论】:

  • 我试过了,什么也没发生。如果参数没问题,问题可能出在 comprobar_usuario.php ??
猜你喜欢
  • 2019-01-26
  • 2013-11-19
  • 1970-01-01
  • 1970-01-01
  • 2013-08-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多