volley studio newrequestqueue example android android-volley

newrequestqueue - volley android studio 2018



Volley JsonObjectRequest Post request not working (7)

¡Fácil para mí! Lo tengo hace unas semanas:

Esto va en el método getBody() , no en getParams() para una solicitud posterior.

Aquí esta el mio :

@Override /** * Returns the raw POST or PUT body to be sent. * * @throws AuthFailureError in the event of auth failure */ public byte[] getBody() throws AuthFailureError { // Map<String, String> params = getParams(); Map<String, String> params = new HashMap<String, String>(); params.put("id","1"); params.put("name", "myname"); if (params != null && params.size() > 0) { return encodeParameters(params, getParamsEncoding()); } return null; }

(Supuse que desea PUBLICAR los parámetros que escribió en su getParams)

Le di los parámetros a la solicitud dentro del constructor, pero ya que está creando la solicitud sobre la marcha, puede codificarlos con fuerza dentro de su anulación del método getBody ().

Así es como se ve mi código:

Bundle param = new Bundle(); param.putString(HttpUtils.HTTP_CALL_TAG_KEY, tag); param.putString(HttpUtils.HTTP_CALL_PATH_KEY, url); param.putString(HttpUtils.HTTP_CALL_PARAM_KEY, params); switch (type) { case RequestType.POST: param.putInt(HttpUtils.HTTP_CALL_TYPE_KEY, RequestType.POST); SCMainActivity.mRequestQueue.add(new SCRequestPOST(Method.POST, url, this, tag, receiver, params));

y si quiere aún más, este último parámetro de cadena proviene de:

param = JsonUtils.XWWWUrlEncoder.encode(new JSONObject(paramasJObj)).toString();

y paramasJObj es algo como esto: {"id"="1","name"="myname"} la cadena JSON habitual.

Estoy usando Android Volley para hacer una solicitud. Entonces uso este código. No entiendo una cosa. Compruebo en mi servidor que params siempre es nulo. Considero que getParams () no funciona. ¿Qué debo hacer para resolver este problema?

RequestQueue queue = MyVolley.getRequestQueue(); JsonObjectRequest jsObjRequest = new JsonObjectRequest(Request.Method.POST,SPHERE_URL,null, new Response.Listener<JSONObject>() { @Override public void onResponse(JSONObject response) { System.out.println(response); hideProgressDialog(); } }, new Response.ErrorListener() { @Override public void onErrorResponse(VolleyError error) { hideProgressDialog(); } }) { protected Map<String, String> getParams() throws AuthFailureError { Map<String, String> params = new HashMap<String, String>(); params.put("id","1"); params.put("name", "myname"); return params; }; }; queue.add(jsObjRequest);


Cuando trabaje con la solicitud JsonObject debe pasar los parámetros inmediatamente después de pasar el enlace en la inicialización, eche un vistazo a este código:

HashMap<String, String> params = new HashMap<>(); params.put("user", "something" ); params.put("some_params", "something" ); JsonObjectRequest request = new JsonObjectRequest(Request.Method.POST, "request_URL", new JSONObject(params), new Response.Listener<JSONObject>() { @Override public void onResponse(JSONObject response) { // Some code } }, new Response.ErrorListener() { @Override public void onErrorResponse(VolleyError error) { //handle errors } }); }


La función de anulación getParams funciona bien. Utiliza el método POST y ha establecido jBody como nulo. Es por eso que no funciona. Puede usar el método GET si quiere enviar null jBody. He reemplazado el método getParams y funciona con el método GET (y null jBody) con el método POST (y jBody! = Null)

También hay todos los ejemplos here


Puede crear un JSONObjectReuqest personalizado y anular el método getParams , o puede proporcionarlos en el constructor como un JSONObject para colocarlos en el cuerpo de la solicitud.

Me gusta esto (edité tu código):

JSONObject obj = new JSONObject(); obj.put("id", "1"); obj.put("name", "myname"); RequestQueue queue = MyVolley.getRequestQueue(); JsonObjectRequest jsObjRequest = new JsonObjectRequest(Request.Method.POST,SPHERE_URL,obj, new Response.Listener<JSONObject>() { @Override public void onResponse(JSONObject response) { System.out.println(response); hideProgressDialog(); } }, new Response.ErrorListener() { @Override public void onErrorResponse(VolleyError error) { hideProgressDialog(); } }); queue.add(jsObjRequest);


Todo lo que necesita hacer es anular el método getParams en la clase Request. Tuve el mismo problema y busqué las respuestas, pero no pude encontrar una correcta. El problema es a diferencia de la solicitud get, los parámetros de publicación que los servidores redirigen pueden ser descartados. Por ejemplo, lee this . Por lo tanto, no arriesgue sus solicitudes para que el servidor web lo redireccione. Si tiene como objetivo http://example/myapp , mencione la dirección exacta de su servicio, es decir, http://example.com/myapp/index.php .
Volley está bien y funciona perfectamente, el problema proviene de otro lado.


Tuve el mismo problema una vez, la matriz POST vacía se debe a una redirección de la solicitud (en su lado del servidor), corrija la URL para que no tenga que ser redirigida cuando llegue al servidor. Por ejemplo, si se fuerza a https usando el archivo .htaccess en su aplicación del lado del servidor, asegúrese de que su solicitud del cliente tenga el prefijo "https: //". Por lo general, cuando ocurre una redirección, la matriz POST se pierde. ¡Espero que esto ayude!


intenta usar esta clase de ayuda

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); } }

En actividad / fragmento usa esto

RequestQueue requestQueue = Volley.newRequestQueue(getActivity()); CustomRequest jsObjRequest = new CustomRequest(Method.POST, url, params, this.createRequestSuccessListener(), this.createRequestErrorListener()); requestQueue.add(jsObjRequest);