Volea - Parámetros POST/GET
Vi la sesión de Google IO 2013 sobre Volley y estoy considerando cambiarme a Volley. ¿Volley admite agregar parámetros POST/GET a la solicitud? En caso afirmativo, ¿cómo puedo hacerlo?
Para los parámetros GET existen 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¶m2=%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á utilizando 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 URIBuilder
y luego usarla ub.setQuery(URLEncodedUtils.format(getGetParams(), "UTF-8"));
para agregar sus parámetros adicionales. De esa manera no te molestarás en comprobar si "?" ya está agregado al uri o se pierde alguno y, por lo tanto, se 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, simplemente anular el getParams()
método.
Puede encontrar un ejemplo funcional (junto con muchos otros ejemplos básicos de Volley) en el proyecto Andorid Volley Ejemplos .
CustomRequest es una forma de resolver que JSONObjectRequest de Volley no pueda publicar parámetros como elStringRequest
aquí está la clase auxiliar 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