Volley JsonObjectRequest Post request not working

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() { @Override public void onResponse(JSONObject response) { System.out.println(response); hideProgressDialog(); } }, new Response.ErrorListener() { @Override public void onErrorResponse(VolleyError error) { hideProgressDialog(); } }) { protected Map getParams() throws AuthFailureError { Map params = new HashMap(); params.put("id","1"); params.put("name", "myname"); return params; }; }; queue.add(jsObjRequest); 

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 { private Listener listener; private Map params; public CustomRequest(String url, Map params, Listener reponseListener, ErrorListener errorListener) { super(Method.GET, url, errorListener); this.listener = reponseListener; this.params = params; } public CustomRequest(int method, String url, Map params, Listener reponseListener, ErrorListener errorListener) { super(method, url, errorListener); this.listener = reponseListener; this.params = params; } protected Map getParams() throws com.android.volley.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)); } } @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); 

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() { @Override public void onResponse(JSONObject response) { System.out.println(response); hideProgressDialog(); } }, new Response.ErrorListener() { @Override public void onErrorResponse(VolleyError error) { hideProgressDialog(); } }); queue.add(jsObjRequest); 

¡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 params = getParams(); Map params = new HashMap(); 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(patwigsJObj)).toString(); 

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

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 esto . Por lo tanto, no arriesgue sus solicitudes para que el servidor web lo redireccione. Si tiene como objective 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.

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 aquí

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 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() { @Override public void onResponse(JSONObject response) { // Some code } }, new Response.ErrorListener() { @Override public void onErrorResponse(VolleyError error) { //handle errors } }); } 

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!