with volley metodo jsonobjectrequest example con android networking android-volley

android - metodo - volley get with parameters



Volley-parĂ¡metros POST/GET (8)

Vi la sesión de Google IO 2013 sobre Volley y estoy considerando cambiar a voleo. ¿Soporta Volley la adición de parámetros POST / GET para solicitar? Si es así, ¿cómo puedo hacerlo?


Para futuros lectores

Me encanta trabajar con Volley . Para ahorrar tiempo de desarrollo, traté de escribir la pequeña biblioteca práctica Gloxey Netwok Manager para configurar Volley con mi proyecto. Incluye el analizador JSON y otros métodos diferentes que ayudan a verificar la disponibilidad de la red.

Use ConnectionManager.class en el que están disponibles diferentes métodos para Volley String y Volley JSON request. Puede realizar solicitudes de GET, PUT, POST, DELETE con o sin encabezado. Puede leer la documentación completa aquí .

Simplemente ponga esta línea en su archivo gradle.

dependencies { compile ''io.gloxey.gnm:network-manager:1.0.1'' }

Volley StringRequest

Método GET (sin encabezado)

ConnectionManager.volleyStringRequest(context, isDialog, progressDialogView, requestURL, volleyResponseInterface);

¿Cómo utilizar?

Configuration Description Context Context isDialog If true dialog will appear, otherwise not. progressView For custom progress view supply your progress view id and make isDialog true. otherwise pass null. requestURL Pass your API URL. volleyResponseInterface Callback for response.

Ejemplo

ConnectionManager.volleyStringRequest(this, false, null, "url", new VolleyResponse() { @Override public void onResponse(String _response) { /** * Handle Response */ } @Override public void onErrorResponse(VolleyError error) { /** * handle Volley Error */ } @Override public void isNetwork(boolean connected) { /** * True if internet is connected otherwise false */ } });

Volley StringRequest

Método POST / PUT / DELETE (sin encabezado)

ConnectionManager.volleyStringRequest(context, isDialog, progressDialogView, requestURL, requestMethod, params, volleyResponseInterface);

Ejemplo

Use Method : Request.Method.POST Request.Method.PUT Request.Method.DELETE Your params : HashMap<String, String> params = new HashMap<>(); params.put("param 1", "value"); params.put("param 2", "value"); ConnectionManager.volleyStringRequest(this, true, null, "url", Request.Method.POST, params, new VolleyResponse() { @Override public void onResponse(String _response) { /** * Handle Response */ } @Override public void onErrorResponse(VolleyError error) { /** * handle Volley Error */ } @Override public void isNetwork(boolean connected) { /** * True if internet is connected otherwise false */ } });

Prima

Gloxey JSON Parser

Siéntase libre de usar el analizador gloxey json para analizar su respuesta api.

YourModel yourModel = GloxeyJsonParser.getInstance().parse(stringResponse, YourModel.class);

Ejemplo

ConnectionManager.volleyStringRequest(this, false, null, "url", new VolleyResponse() { @Override public void onResponse(String _response) { /** * Handle Response */ try { YourModel yourModel = GloxeyJsonParser.getInstance().parse(_response, YourModel.class); } catch (Exception e) { e.printStackTrace(); } } @Override public void onErrorResponse(VolleyError error) { /** * handle Volley Error */ if (error instanceof TimeoutError || error instanceof NoConnectionError) { showSnackBar(parentLayout, getString(R.string.internet_not_found), getString(R.string.retry), new View.OnClickListener() { @Override public void onClick(View view) { //handle retry button } }); } else if (error instanceof AuthFailureError) { } else if (error instanceof ServerError) { } else if (error instanceof NetworkError) { } else if (error instanceof ParseError) { } } @Override public void isNetwork(boolean connected) { /** * True if internet is connected otherwise false */ if (!connected) { showSnackBar(parentLayout, getString(R.string.internet_not_found), getString(R.string.retry), new View.OnClickListener() { @Override public void onClick(View view) { //Handle retry button } }); } }); public void showSnackBar(View view, String message) { Snackbar.make(view, message, Snackbar.LENGTH_LONG).show(); } public void showSnackBar(View view, String message, String actionText, View.OnClickListener onClickListener) { Snackbar.make(view, message, Snackbar.LENGTH_LONG).setAction(actionText, onClickListener).show(); }


Al tratar con los parámetros GET , repetí la solución de Andrea Motto. El problema fue que Volley llamó a GetUrl varias veces y su solución, utilizando un iterador, destruyó el objeto Map original. Las siguientes llamadas internas de Volley tenían un objeto params vacío.

Agregué también la codificación de parámetros.

Este es un uso en línea (sin subclase).

public void GET(String url, Map<String, String> params, Response.Listener<String> response_listener, Response.ErrorListener error_listener, String API_KEY, String stringRequestTag) { final Map<String, String> mParams = params; final String mAPI_KEY = API_KEY; final String mUrl = url; StringRequest stringRequest = new StringRequest( Request.Method.GET, mUrl, response_listener, error_listener ) { @Override protected Map<String, String> getParams() { return mParams; } @Override public String getUrl() { StringBuilder stringBuilder = new StringBuilder(mUrl); int i = 1; for (Map.Entry<String,String> entry: mParams.entrySet()) { String key; String value; try { key = URLEncoder.encode(entry.getKey(), "UTF-8"); value = URLEncoder.encode(entry.getValue(), "UTF-8"); if(i == 1) { stringBuilder.append("?" + key + "=" + value); } else { stringBuilder.append("&" + key + "=" + value); } } catch (UnsupportedEncodingException e) { e.printStackTrace(); } i++; } String url = stringBuilder.toString(); return url; } @Override public Map<String, String> getHeaders() { Map<String, String> headers = new HashMap<>(); if (!(mAPI_KEY.equals(""))) { headers.put("X-API-KEY", mAPI_KEY); } return headers; } }; if (stringRequestTag != null) { stringRequest.setTag(stringRequestTag); } mRequestQueue.add(stringRequest); }

Esta función usa encabezados para pasar una APIKEY y establece un TAG a la solicitud útil para cancelarla antes de su finalización.

Espero que esto ayude.


CustomRequest es una forma de resolver el Volley''s JSONObjectRequest no puede publicar parámetros como StringRequest

aquí está la clase de ayuda que permite agregar parámetros:

import java.io.UnsupportedEncodingException; import java.util.Map; import org.json.JSONException; import org.json.JSONObject; import com.android.volley.NetworkResponse; import com.android.volley.ParseError; import com.android.volley.Request; import com.android.volley.Response; import com.android.volley.Response.ErrorListener; import com.android.volley.Response.Listener; import com.android.volley.toolbox.HttpHeaderParser; public class CustomRequest extends Request<JSONObject> { private Listener<JSONObject> listener; private Map<String, String> params; public CustomRequest(String url, Map<String, String> params, Listener<JSONObject> reponseListener, ErrorListener errorListener) { super(Method.GET, url, errorListener); this.listener = reponseListener; this.params = params; } public CustomRequest(int method, String url, Map<String, String> params, Listener<JSONObject> reponseListener, ErrorListener errorListener) { super(method, url, errorListener); this.listener = reponseListener; this.params = params; } protected Map<String, String> getParams() throws com.android.volley.AuthFailureError { return params; }; @Override protected Response<JSONObject> 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)); } } @Override protected void deliverResponse(JSONObject response) { // TODO Auto-generated method stub listener.onResponse(response); } }

gracias a Greenchiu


En su clase de solicitud (que amplía la solicitud), anule el método getParams (). Haría lo mismo con los encabezados, simplemente anule getHeaders ().

Si observas la clase PostWithBody en TestRequest.java en las pruebas de Volley, encontrarás un ejemplo. Es algo parecido a esto

public class LoginRequest extends Request<String> { // ... other methods go here private Map<String, String> mParams; public LoginRequest(String param1, String param2, Listener<String> listener, ErrorListener errorListener) { super(Method.POST, "http://test.url", errorListener); mListener = listener; mParams = new HashMap<String, String>(); mParams.put("paramOne", param1); mParams.put("paramTwo", param2); } @Override public Map<String, String> getParams() { return mParams; } }

Evan Charlton tuvo la amabilidad de hacer un rápido proyecto de ejemplo para mostrarnos cómo usar la descarga. https://github.com/evancharlton/folly/


Esta clase de ayuda administra los parámetros para las solicitudes GET y POST :

import java.io.UnsupportedEncodingException; import java.util.Iterator; import java.util.Map; import org.json.JSONException; import org.json.JSONObject; import com.android.volley.NetworkResponse; import com.android.volley.ParseError; import com.android.volley.Request; import com.android.volley.Response; import com.android.volley.Response.ErrorListener; import com.android.volley.Response.Listener; import com.android.volley.toolbox.HttpHeaderParser; public class CustomRequest extends Request<JSONObject> { private int mMethod; private String mUrl; private Map<String, String> mParams; private Listener<JSONObject> mListener; public CustomRequest(int method, String url, Map<String, String> params, Listener<JSONObject> reponseListener, ErrorListener errorListener) { super(method, url, errorListener); this.mMethod = method; this.mUrl = url; this.mParams = params; this.mListener = reponseListener; } @Override public String getUrl() { if(mMethod == Request.Method.GET) { if(mParams != null) { StringBuilder stringBuilder = new StringBuilder(mUrl); Iterator<Map.Entry<String, String>> iterator = mParams.entrySet().iterator(); int i = 1; while (iterator.hasNext()) { Map.Entry<String, String> entry = iterator.next(); if (i == 1) { stringBuilder.append("?" + entry.getKey() + "=" + entry.getValue()); } else { stringBuilder.append("&" + entry.getKey() + "=" + entry.getValue()); } iterator.remove(); // avoids a ConcurrentModificationException i++; } mUrl = stringBuilder.toString(); } } return mUrl; } @Override protected Map<String, String> getParams() throws com.android.volley.AuthFailureError { return mParams; }; @Override protected Response<JSONObject> 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)); } } @Override protected void deliverResponse(JSONObject response) { // TODO Auto-generated method stub mListener.onResponse(response); } }


Esto puede ayudarte ...

private void loggedInToMainPage(final String emailName, final String passwordName) { String tag_string_req = "req_login"; StringRequest stringRequest = new StringRequest(Request.Method.POST, "http://localhost/index", new Response.Listener<String>() { @Override public void onResponse(String response) { Log.d(TAG, "Login Response: " + response.toString()); try { JSONObject jsonObject = new JSONObject(response); Boolean error = jsonObject.getBoolean("error"); if (!error) { String uid = jsonObject.getString("uid"); JSONObject user = jsonObject.getJSONObject("user"); String email = user.getString("email"); String password = user.getString("password"); session.setLogin(true); Intent intent = new Intent(getApplicationContext(), MainActivity.class); startActivity(intent); finish(); Toast.makeText(getApplicationContext(), "its ok", Toast.LENGTH_SHORT).show(); } } catch (JSONException e) { e.printStackTrace(); } } }, new Response.ErrorListener() { @Override public void onErrorResponse(VolleyError volleyError) { System.out.println("volley Error ................."); } }) { @Override protected Map<String, String> getParams() throws AuthFailureError { Map<String, String> params = new HashMap<String, String>(); params.put("tag", "login"); params.put("email", emailName); params.put("password", passwordName); return params; } }; MyApplication.getInstance().addToRequestQueue(stringRequest,tag_string_req); }


Para proporcionar el parámetro POST , envíe su parámetro como JSONObject al constructor JsonObjectRequest . El tercer parámetro acepta un JSONObject que se utiliza en el cuerpo de la solicitud.

JSONObject paramJson = new JSONObject(); paramJson.put("key1", "value1"); paramJson.put("key2", "value2"); JsonObjectRequest jsonObjectRequest = new JsonObjectRequest(Request.Method.POST,url,paramJson, new Response.Listener<JSONObject>() { @Override public void onResponse(JSONObject response) { } }, new Response.ErrorListener() { @Override public void onErrorResponse(VolleyError error) { } }); requestQueue.add(jsonObjectRequest);


Para los parámetros GET hay dos alternativas:

Primero : Como se sugiere en un comentario debajo de la pregunta, puede usar String y reemplazar los marcadores de posición de los parámetros con sus valores, como:

String uri = String.format("http://somesite.com/some_endpoint.php?param1=%1$s&param2=%2$s", num1, num2); StringRequest myReq = new StringRequest(Method.GET, uri, createMyReqSuccessListener(), createMyReqErrorListener()); queue.add(myReq);

donde num1 y num2 son variables de cadena que contienen sus valores.

Segundo : si está usando HttpClient externo más nuevo (4.2.x por ejemplo) puede usar URIBuilder para construir su Uri. La ventaja es que si su cadena uri ya tiene parámetros, será más fácil pasarla al URIBuilder y luego usar ub.setQuery(URLEncodedUtils.format(getGetParams(), "UTF-8")); para agregar tus parámetros adicionales. De esa forma, no se molestará en verificar si "?" ya se ha agregado al uri o a perder algunos y, por lo tanto, elimina una fuente de posibles errores.

Para los parámetros POST, probablemente a veces será más fácil que la respuesta aceptada hacerlo como:

StringRequest myReq = new StringRequest(Method.POST, "http://somesite.com/some_endpoint.php", createMyReqSuccessListener(), createMyReqErrorListener()) { protected Map<String, String> getParams() throws com.android.volley.AuthFailureError { Map<String, String> params = new HashMap<String, String>(); params.put("param1", num1); params.put("param2", num2); return params; }; }; queue.add(myReq);

por ejemplo, para anular el método getParams() .

Puede encontrar un ejemplo de trabajo (junto con muchos otros ejemplos básicos de Volley) en el proyecto Andorid Volley Examples .