Volley: enviar una solicitud POST utilizando JSONArrayRequest

Estoy usando Volley para interactuar con una API. Necesito enviar una solicitud posterior (con parámetros) a un servicio que devuelve una matriz JSON.

JsonObjectRequest tiene un constructor que toma un método y un conjunto de parámetros

JsonObjectRequest(int method, java.lang.String url, JSONObject jsonRequest, Response.Listener listener, Response.ErrorListener errorListener) 

Sin embargo, JSONArrayRequest (el que necesito) solo tiene un constructor de la forma

 JsonArrayRequest(java.lang.String url, Response.Listener listener, Response.ErrorListener errorListener) 

¿Cómo puedo hacer que esto envíe una solicitud POST con datos?

Probablemente lo agregarán más tarde, pero mientras tanto, puede agregar el constructor deseado usted mismo:

 public JsonArrayRequest(int method, String url, JSONObject jsonRequest, Listener listener, ErrorListener errorListener) { super(method, url, (jsonRequest == null) ? null : jsonRequest.toString(), listener, errorListener); } 

Esto no se ha probado, aunque no veo ninguna razón para que esto no funcione, ya que los detalles de implementación están en la JsonRequest : JsonRequest .

Pruébalo y ve si funciona.

EDITAR:

¡Lo llamé! Les tomó casi dos años después de que respondí esto, pero el equipo Volley agregó este constructor el 19 de marzo de 2015 al repository. ¿Adivina qué? Esta es la syntax EXACTA.

Era flojo y no construí la librería Volley (solo usé el .jar), por lo tanto no tengo código fuente … así que en el nuevo JSONArrayRequest anónimo JSONArrayRequest estas funciones:

  // NO CONSTRUCTOR AVAILABLE FOR POST AND PARAMS FOR JSONARRAY! // overridden the necessary functions for this @Override public byte[] getBody() { try { return paramsArray.toString().getBytes("utf-8"); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } return null; } @Override public int getMethod() { return Method.POST; } 

Este código hará lo que quieras

  Volley.newRequestQueue(context).add( new JsonRequest(Request.Method.POST, "url/", null, new Response.Listener() { @Override public void onResponse(JSONArray response) { } }, new Response.ErrorListener() { @Override public void onErrorResponse(VolleyError error) { } }) { @Override protected Map getParams() { Map params = new HashMap(); params.put("param1", "one"); params.put("param2", "two"); return params; } @Override protected Response parseNetworkResponse( NetworkResponse response) { try { String jsonString = new String(response.data, HttpHeaderParser .parseCharset(response.headers)); return Response.success(new JSONArray(jsonString), HttpHeaderParser .parseCacheHeaders(response)); } catch (UnsupportedEncodingException e) { return Response.error(new ParseError(e)); } catch (JSONException je) { return Response.error(new ParseError(je)); } } }); 

La mejor y más fácil manera de enviar solicitudes de parámetros y devolver respuestas personalizadas de acuerdo con el parámetro usando JSONarray Request es agregar el valor de obtener parámetros en la URL misma.

 String URL ="http://mentormentee.gear.host/android_api/Message.aspx?key="+keyvalue; 

donde keyvalue valor del parámetro y agregue esta URL en la URL JsonArrayRequest simple.

  JsonArrayRequest searchMsg= new JsonArrayRequest(URL, new Response.Listener() { @Override public void onResponse(JSONArray response) { Log.d(TAG, response.toString()); // Parsing json for (int i = 0; i < response.length(); i++) { try { JSONObject obj = response.getJSONObject(i); Message msg = new Message(); msg.setMessageThread(obj.getString("msgThread")); msg.setUserName(obj.getString("Username")); msg.setDate(obj.getString("msgDate")); // adding movie to movies array MessageList.add(msg); } catch (JSONException e) { e.printStackTrace(); } } // notifying list adapter about data changes // so that it renders the list view with updated data adapter.notifyDataSetChanged(); } }, new Response.ErrorListener() { @Override public void onErrorResponse(VolleyError error) { VolleyLog.d(TAG, "Error: " + error.getMessage()); // hidePDialog(); } }); // Adding request to request queue AppController.getInstance().addToRequestQueue(searchMsg); } 
 You can use this package HelperClass; /* * Copyright (C) 2011 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ import com.android.volley.NetworkResponse; import com.android.volley.ParseError; import com.android.volley.Response; import com.android.volley.Response.ErrorListener; import com.android.volley.Response.Listener; import com.android.volley.toolbox.HttpHeaderParser; import com.android.volley.toolbox.JsonRequest; import org.json.JSONArray; import org.json.JSONException; import org.json.JSONObject; import java.io.UnsupportedEncodingException; import java.util.Map; /** * A request for retrieving a {@link JSONArray} response body at a given URL.enter code here */ public class MyjsonPostRequest extends JsonRequest { protected static final String PROTOCOL_CHARSET = "utf-8"; /** * Creates a new request. * @param method the HTTP method to use * @param url URL to fetch the JSON from * @param requestBody A {@link String} to post with the request. Null is allowed and * indicates no parameters will be posted along with request. * @param listener Listener to receive the JSON response * @param errorListener Error listener, or null to ignore errors. */ public MyjsonPostRequest(int method, String url, String requestBody, Listener listener, ErrorListener errorListener) { super(method, url, requestBody, listener, errorListener); } /** * Creates a new request. * @param url URL to fetch the JSON from * @param listener Listener to receive the JSON response * @param errorListener Error listener, or null to ignore errors. */ public MyjsonPostRequest(String url, Listener listener, ErrorListener errorListener) { super(Method.GET, url, null, listener, errorListener); } /** * Creates a new request. * @param method the HTTP method to use * @param url URL to fetch the JSON from * @param listener Listener to receive the JSON response * @param errorListener Error listener, or null to ignore errors. */ public MyjsonPostRequest(int method, String url, Listener listener, ErrorListener errorListener) { super(method, url, null, listener, errorListener); } /** * Creates a new request. * @param method the HTTP method to use * @param url URL to fetch the JSON from * @param jsonRequest A {@link JSONArray} to post with the request. Null is allowed and * indicates no parameters will be posted along with request. * @param listener Listener to receive the JSON response * @param errorListener Error listener, or null to ignore errors. */ public MyjsonPostRequest(int method, String url, JSONArray jsonRequest, Listener listener, ErrorListener errorListener) { super(method, url, (jsonRequest == null) ? null : jsonRequest.toString(), listener, errorListener); } /** * Creates a new request. * @param method the HTTP method to use * @param url URL to fetch the JSON from * @param jsonRequest A {@link JSONObject} to post with the request. Null is allowed and * indicates no parameters will be posted along with request. * @param listener Listener to receive the JSON response * @param errorListener Error listener, or null to ignore errors. */ public MyjsonPostRequest(int method, String url, JSONObject jsonRequest, Listener listener, ErrorListener errorListener) { super(method, url, (jsonRequest == null) ? null : jsonRequest.toString(), listener, errorListener); } /** * Constructor which defaults to GET if jsonRequest is * null, POST otherwise. * * @see #MyjsonPostRequest(int, String, JSONArray, Listener, ErrorListener) */ public MyjsonPostRequest(String url, JSONArray jsonRequest, Listener listener, ErrorListener errorListener) { this(jsonRequest == null ? Method.GET : Method.POST, url, jsonRequest, listener, errorListener); } /** * Constructor which defaults to GET if jsonRequest is * null, POST otherwise. * * @see #MyjsonPostRequest(int, String, JSONObject, Listener, ErrorListener) */ public MyjsonPostRequest(String url, JSONObject jsonRequest, Listener listener, ErrorListener errorListener) { this(jsonRequest == null ? Method.GET : Method.POST, url, jsonRequest, listener, errorListener); } @Override protected Response parseNetworkResponse(NetworkResponse response) { try { String jsonString = new String(response.data, HttpHeaderParser.parseCharset(response.headers)); return Response.success(new JSONArray(jsonString), HttpHeaderParser.parseCacheHeaders(response)); } catch (UnsupportedEncodingException e) { return Response.error(new ParseError(e)); } catch (JSONException je) { return Response.error(new ParseError(je)); } } } 

Puede ser que su problema esté resuelto, pero espero que esto sea útil para otros usuarios. Lo que hice fue crear una nueva clase personalizada ampliándola … aquí está el código.

 public class CustomJsonRequest extends Request { Map params; private Response.Listener listener; public CustomJsonRequest(int requestMethod, String url, Map params, Response.Listener responseListener, Response.ErrorListener errorListener) { super(requestMethod, url, errorListener); this.params = params; this.listener = responseListener; } @Override protected void deliverResponse(Object response) { listener.onResponse(response); } @Override public Map getParams() throws AuthFailureError { return params; } @Override protected Response parseNetworkResponse(NetworkResponse response) { try { String jsonString = new String(response.data, HttpHeaderParser.parseCharset(response.headers)); return Response.success(new JSONObject(jsonString), HttpHeaderParser.parseCacheHeaders(response)); } catch (UnsupportedEncodingException e) { return Response.error(new ParseError(e)); } catch (JSONException je) { return Response.error(new ParseError(je)); } } } 

puede usar esta clase en lugar de JsonArrayRequest o JSonObjectRequest. Y esto también resuelve el problema de que php no pueda capturar el parámetro de publicación en $ _POST

solo agregue algunos detalles sobre JsonArrayRequest. en \ src \ com \ android \ voley \ toolbox, puede descubrir que el constructo predeterminado de JsonArrayRequest no admite el parámetro Método y el método de adición de voley (GET) en el constructo, por lo que si desea usar otro método, intente escribirlo usted mismo

 public class JsonArrayRequest extends JsonRequest { /** * Creates a new request. * @param url URL to fetch the JSON from * @param listener Listener to receive the JSON response * @param errorListener Error listener, or null to ignore errors. */ public JsonArrayRequest(String url, Listener listener, ErrorListener errorListener) { super(Method.GET, url, null, listener, errorListener); } 
 List> listMap = new ArrayList>(); Map map = new HashMap(); try { map.put("email", customer.getEmail()); map.put("password",customer.getPassword()); } catch (Exception e) { e.printStackTrace(); } listMap.add(map); String url = PersonalConstants.BASE_URL+"/url"; JsonObjectRequest jsonObjectRequest = new JsonObjectRequest( Request.Method.POST, url, String.valueOf(new JSONArray(listMap)), new Response.Listener() { @Override public void onResponse(JSONObject jsonObject) { Log.d(App.TAG, jsonObject.toString()); } }, new Response.ErrorListener (){ @Override public void onErrorResponse(VolleyError volleyError) { Log.d(App.TAG,volleyError.toString()); } } ); App.getInstance().getmRequestQueue().add(jsonObjectRequest); 
 JsonArrayRequest req = new JsonArrayRequest(urlJsonArry, new Response.Listener() { @Override public void onResponse(JSONArray response) { Log.d(TAG, response.toString()); try { // Parsing json array response // loop through each json object jsonResponse = ""; for (int i = 0; i < response.length(); i++) { JSONObject person = (JSONObject) response .get(i); String name = person.getString("name"); String email = person.getString("email"); JSONObject phone = person .getJSONObject("phone"); String home = phone.getString("home"); String mobile = phone.getString("mobile"); jsonResponse += "Name: " + name + "\n\n"; jsonResponse += "Email: " + email + "\n\n"; jsonResponse += "Home: " + home + "\n\n"; jsonResponse += "Mobile: " + mobile + "\n\n\n"; } txtResponse.setText(jsonResponse); } catch (JSONException e) { e.printStackTrace(); Toast.makeText(getApplicationContext(), "Error: " + e.getMessage(), Toast.LENGTH_LONG).show(); } hidepDialog(); } }, new Response.ErrorListener() { @Override public void onErrorResponse(VolleyError error) { VolleyLog.d(TAG, "Error: " + error.getMessage()); Toast.makeText(getApplicationContext(), error.getMessage(), Toast.LENGTH_SHORT).show(); hidepDialog(); } }); // Adding request to request queue AppController.getInstance().addToRequestQueue(req); 

}