Android Volley - 带有帖子参数的JsonArrayRequest

时间:2015-06-01 16:29:07

标签: android android-volley

我正在使用VolleyAPI进行互动。我需要将带参数的帖子请求发送到返回JSONArray

的服务

我正在覆盖方法protected Map<String, String> getParams(),但它不起作用:

JsonArrayRequest eventoReq = new JsonArrayRequest(Configuracion.URL_API_PROXIMOS_EVENTOS,
                new Response.Listener<JSONArray>() {
                    @Override
                    public void onResponse(JSONArray response) {
                        Log.d(TAG, response.toString());

                        hidePDialog();

                        // Parsea json
                        for (int i = 0; i < response.length(); i++) {
                            try {
                                JSONObject obj = response.getJSONObject(i);

                                Evento evento = new Evento();
                                evento.setCod_evento(obj.getInt("cod_evento"));
                                evento.setTitulo(obj.getString("titulo"));
                                evento.setDescripcion(obj.getString("descripcion"));
                                evento.setDireccion(obj.getString("direccion"));
                                evento.setImagen(obj.getString("imagen"));
                                evento.setPuntuacion((float) obj.getDouble("puntuacion"));

                                // Añade el evento al listado
                                listaEventos.add(evento);

                            } catch (JSONException e) {
                                e.printStackTrace();
                            }

                        }

                        // Actualiza el adaptador
                        adapter.notifyDataSetChanged();
                    }
                }, new Response.ErrorListener() {
            @Override
            public void onErrorResponse(VolleyError error) {
                VolleyLog.d(TAG, "Error: " + error.getMessage());
                hidePDialog();

            }
        }){
            @Override
            protected Map<String, String> getParams() {
                // Posting parameters to login url
                Map<String, String> params = new HashMap<String, String>();
                params.put("tag", "eventos_proximos_usuario");
                params.put("cod_usuario", cod_usuario);
                return params;
            }

            @Override
            public int getMethod() {
                return Method.POST;
            }
        };

        // Añade la peticion a la cola
        AppController.getInstance().addToRequestQueue(eventoReq);

4 个答案:

答案 0 :(得分:6)

尝试...... StringRequest代替..

参考: https://android.googlesource.com/platform/frameworks/volley/+/master/src/main/java/com/android/volley/toolbox

JsonObjectRequest扩展了JsonRequest

而StringRequest扩展了Request

StringRequest eventoReq = new StringRequest(Request.Method.POST,Configuracion.URL_API_PROXIMOS_EVENTOS,
            new Response.Listener<String>() {
                @Override
                public void onResponse(String response) {
                    Log.d(TAG, response.toString());

                    hidePDialog();
try{
 JSONArray j= new JSONArray(response);

                    // Parsea json
                    for (int i = 0; i < j.length(); i++) {
                        try {
                            JSONObject obj = j.getJSONObject(i);

                            Evento evento = new Evento();
                            evento.setCod_evento(obj.getInt("cod_evento"));
                            evento.setTitulo(obj.getString("titulo"));
                            evento.setDescripcion(obj.getString("descripcion"));
                            evento.setDireccion(obj.getString("direccion"));
                            evento.setImagen(obj.getString("imagen"));
                            evento.setPuntuacion((float) obj.getDouble("puntuacion"));

                            // Añade el evento al listado
                            listaEventos.add(evento);

                        } catch (JSONException e) {
                            e.printStackTrace();
                        }

                    }
// Actualiza el adaptador
                    adapter.notifyDataSetChanged();
} catch (JSONException e) {
                        e.printStackTrace();
                    }


                }
            }, new Response.ErrorListener() {
        @Override
        public void onErrorResponse(VolleyError error) {
            VolleyLog.d(TAG, "Error: " + error.getMessage());
            hidePDialog();

        }
    }){
        @Override
        protected Map<String, String> getParams() {
            // Posting parameters to login url
            Map<String, String> params = new HashMap<String, String>();
            params.put("tag", "eventos_proximos_usuario");
            params.put("cod_usuario", cod_usuario);
            return params;
        }
    };

    // Añade la peticion a la cola
    AppController.getInstance().addToRequestQueue(eventoReq);

我只是初学者希望它有所帮助!!!

答案 1 :(得分:1)

试试这样, 我认为你不需要覆盖getMethod()方法。

将方法类型(即Method.POST)名称传递给JsonObjectRequest or JsonArrayRequest,如下所示。

JsonObjectRequest jsonObjReq = new JsonObjectRequest(Method.POST,
                url, null,
                new Response.Listener<JSONObject>() {

                    @Override
                    public void onResponse(JSONObject response) {
                        Log.d(TAG, response.toString());
                        pDialog.hide();
                    }
                }, new Response.ErrorListener() {

                    @Override
                    public void onErrorResponse(VolleyError error) {
                        VolleyLog.d(TAG, "Error: " + error.getMessage());
                        pDialog.hide();
                    }
                }) {

            @Override
            protected Map<String, String> getParams() {
                // Posting parameters to login url
                Map<String, String> params = new HashMap<String, String>();
                params.put("tag", "eventos_proximos_usuario");
                params.put("cod_usuario", cod_usuario);
                return params;
            }

        };

// Adding request to request queue
AppController.getInstance().addToRequestQueue(jsonObjReq, tag_json_obj);

答案 2 :(得分:0)

当我开始在我的android项目中使用Volley时,我遇到了同样的问题。我通过使用StringRequest而不是JsonArrayRequest解决了这个问题。 例如,如果要显示带有某些服务器数据的ListView ... 只需使用一个简单的StringRequest而不是JSONArrayRequest,就像这样实现onResponse Methode:

<form is="iron-form" method="post" action="/" id="basic">
    <template is="dom-repeat" id="addresses" items="[[addresses]]">
        <paper-input name="addresses[[[index]]].city" label="City" value="[[item.city]]"></paper-input>
        <paper-input name="addresses[[[index]]].street" label="Street" value="[[item.street]]"></paper-input>
    </template>
</form>

答案 3 :(得分:0)

StringRequest request = new StringRequest(Request.Method.POST, YourUrl, new Response.Listener<String>() {
        @Override
        public void onResponse(String response) {
            if (!response.equals(null)) {
                Log.e("Your Array Response", response);                    
            } else {
                Log.e("Your Array Response", "Data Null");
            }
        }

    }, new Response.ErrorListener() {
        @Override
        public void onErrorResponse(VolleyError error) {
            Log.e("error is ", "" + error);
        }
    }) {    

     //This is for Headers If You Needed
        @Override
        public Map<String, String> getHeaders() throws AuthFailureError {
            Map<String, String> params = new HashMap<String, String>();
            params.put("Content-Type", "application/json; charset=UTF-8");
            params.put("token", ACCESS_TOKEN);
            return params;
        }

     //Pass Your Parameters here
        @Override
        protected Map<String, String> getParams() {
            Map<String, String> params = new HashMap<String, String>();
            params.put("User", UserName);
            params.put("Pass", PassWord);
            return params;
        }
    };
    RequestQueue queue = Volley.newRequestQueue(getApplicationContext());
    queue.add(request);
相关问题