volley studio jsonarrayrequest jsonarray example array java android android-volley

java - studio - volley json request



Volley-Enviar una solicitud POST utilizando JSONArrayRequest (9)

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

public class CustomJsonRequest extends Request { Map<String, String> params; private Response.Listener listener; public CustomJsonRequest(int requestMethod, String url, Map<String, String> 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<String, String> 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 utilizar esta clase en lugar de JsonArrayRequest o JSonObjectRequest. Y esto también resuelve el problema de php no poder capturar el parámetro post en $ _POST

Estoy usando Volley para interactuar con una API. Necesito enviar una solicitud de publicación (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<JSONObject> listener, Response.ErrorListener errorListener)

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

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

¿Cómo puedo hacer esto enviar una solicitud POST con datos?


Este código hará lo que quieras.

Volley.newRequestQueue(context).add( new JsonRequest<JSONArray>(Request.Method.POST, "url/", null, new Response.Listener<JSONArray>() { @Override public void onResponse(JSONArray response) { } }, new Response.ErrorListener() { @Override public void onErrorResponse(VolleyError error) { } }) { @Override protected Map<String, String> getParams() { Map<String, String> params = new HashMap<String, String>(); params.put("param1", "one"); params.put("param2", "two"); return params; } @Override protected Response<JSONArray> 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 forma mejor y más fácil de enviar una solicitud de parámetros y devolver una respuesta personalizada de acuerdo con el parámetro que utiliza la solicitud JSONarray es agregar el valor para obtener el parámetro paramater en la propia URL.

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

donde el valor del parámetro valor de keyvalue y agregar esta URL en la URL de JsonArrayRequest es simple.

JsonArrayRequest searchMsg= new JsonArrayRequest(URL, new Response.Listener<JSONArray>() { @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); }


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

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

Esto no está probado, aunque no veo por qué no debería funcionar ya que los detalles de la implementación están en la súper clase: JsonRequest .

Pruébalo y ve si funciona.

EDITAR:

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


Yo era perezoso y no construí la biblioteca de Volley (solo usé el .jar), por lo tanto no tengo código fuente ... así que en el anónimo nuevo JSONArrayRequest agregué 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; }


solo agrega algunos detalles sobre JsonArrayRequest. en / src / com / android / volley / toolbox, puede descubrir que la construcción predeterminada de JsonArrayRequest no admite el parámetro Método y el método de agregar volea (GET) en la construcción, así que si desea usar otro método, intente escribirlo usted mismo

public class JsonArrayRequest extends JsonRequest<JSONArray> { /** * 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<JSONArray> listener, ErrorListener errorListener) { super(Method.GET, url, null, listener, errorListener); }


JsonArrayRequest req = new JsonArrayRequest(urlJsonArry, new Response.Listener<JSONArray>() { @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);

}


List<Map<String,String>> listMap = new ArrayList<Map<String, String>>(); Map<String,String> map = new HashMap<String,String>(); 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<JSONObject>() { @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);


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<JSONArray> { 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<JSONArray> 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<JSONArray> 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<JSONArray> 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<JSONArray> 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<JSONArray> listener, ErrorListener errorListener) { super(method, url, (jsonRequest == null) ? null : jsonRequest.toString(), listener, errorListener); } /** * Constructor which defaults to <code>GET</code> if <code>jsonRequest</code> is * <code>null</code>, <code>POST</code> otherwise. * * @see #MyjsonPostRequest(int, String, JSONArray, Listener, ErrorListener) */ public MyjsonPostRequest(String url, JSONArray jsonRequest, Listener<JSONArray> listener, ErrorListener errorListener) { this(jsonRequest == null ? Method.GET : Method.POST, url, jsonRequest, listener, errorListener); } /** * Constructor which defaults to <code>GET</code> if <code>jsonRequest</code> is * <code>null</code>, <code>POST</code> otherwise. * * @see #MyjsonPostRequest(int, String, JSONObject, Listener, ErrorListener) */ public MyjsonPostRequest(String url, JSONObject jsonRequest, Listener<JSONArray> listener, ErrorListener errorListener) { this(jsonRequest == null ? Method.GET : Method.POST, url, jsonRequest, listener, errorListener); } @Override protected Response<JSONArray> 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)); } } }