Saltar al contenido

Volley JsonObjectRequest La solicitud de publicación no funciona

Noé, miembro de nuestro staff, nos ha hecho el favor de redactar este artículo ya que domina perfectamente el tema.

Solución:

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

Puedes crear una personalizada JSONObjectReuqest y anular el getParams método, o puede proporcionarlos en el constructor como un JSONObject para colocar en el cuerpo de la solicitud.

Así (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 conseguí hace unas semanas:

esto entra getBody() método, no en getParams() para una solicitud de publicación.

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 dado que está creando la solicitud sobre la marcha, puede codificarlos 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 quieres aun mas esto ultimo string parámetros viene de :

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

y el paramasJObj es algo como esto: "id"="1","name"="myname" el JSON habitual string.

Aquí tienes las comentarios y puntuaciones

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *