web-dev-qa-db-fra.com

Volley JsonObjectRequest La requête de post ne fonctionne pas

J'utilise Android Volley pour effectuer une demande. Donc j'utilise ce code. Je ne comprends pas une chose. Je vérifie dans mon serveur que params est toujours nul. Je considère que getParams () ne fonctionne pas. Que dois-je faire pour résoudre ce problème?.

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

essayez d'utiliser cette classe d'assistance

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 activité/fragment utilisez-le

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

requestQueue.add(jsObjRequest);
127
LOG_TAG

Vous pouvez créer un JSONObjectReuqest personnalisé et substituer la méthode getParams, ou vous pouvez les fournir dans le constructeur en tant que JSONObject à placer dans le corps de la demande.

Comme ceci (j'ai édité votre code):

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);
27
Itai Hanski

Facile pour moi! Je l'ai eu il y a quelques semaines:

Cela va dans la méthode getBody(), pas dans getParams() pour une demande de publication.

Voici le mien :

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

}

(J'ai supposé que vous vouliez POST les paramètres que vous avez écrits dans vos getParams)

J'ai donné les paramètres à la demande à l'intérieur du constructeur, mais puisque vous créez la demande à la volée, vous pouvez les coder en dur dans votre remplacement de la méthode getBody ().

Voici à quoi ressemble mon code:

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

et si vous voulez encore plus cette dernière chaîne params vient de:

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

et le paramasJObj est quelque chose comme ceci: {"id"="1","name"="myname"} la chaîne JSON habituelle.

5
Poutrathor

Lorsque vous travaillez avec une requête JsonObject, vous devez passer les paramètres juste après avoir passé le lien lors de l'initialisation, regardez ce code:

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


}
2
Kmelliti

J'ai eu le même problème une fois, le tableau vide POST est dû à une redirection de la demande (côté serveur), corrige l'URL afin qu'elle ne doive pas être redirigée lorsqu'elle frappe le serveur. Par exemple, si https est forcé à l'aide du fichier .htaccess sur votre application côté serveur, assurez-vous que votre demande client contient le préfixe "https: //". Habituellement, lorsqu'une redirection se produit, le tableau POST est perdu. J'espère que ça aide!

La fonction de substitution getParams fonctionne bien. Vous utilisez la méthode POST et vous avez défini jBody comme null. C'est pourquoi ça ne marche pas. Vous pouvez utiliser la méthode GET si vous souhaitez envoyer une valeur nulle de jBody. J'ai surchargé la méthode getParams et cela fonctionne soit avec la méthode GET (et null jBody) soit avec la méthode POST (et jBody! = Null)

Il y a aussi tous les exemples ici

1
user4292106

Tout ce que vous avez à faire est de remplacer la méthode getParams dans la classe Request. J'ai eu le même problème et j'ai cherché dans les réponses mais je n'ai pas pu trouver celle qui convient. Le problème est différent de get request, les paramètres de post étant redirigés par les serveurs peuvent être supprimés. Par exemple, lisez this . Donc, ne risquez pas que vos demandes soient redirigées par le serveur Web. Si vous visez http: // exemple/monapp , mentionnez l'adresse exacte de votre service, c'est-à-dire http://example.com/myapp/index.php .
Volley va bien et fonctionne parfaitement, le problème vient d’ailleurs.

1
Davood Falahati