Paramètres Volley-POST / GET
j'ai vu la session Google IO 2013 sur Volley et j'envisage de passer à volley. Est-ce que Volley supporte l'ajout de paramètres POST / GET à la demande? Si oui, comment puis-je le faire?
8 réponses
dans votre classe Request (that extends Request), outrepassez la méthode getParams (). Vous feriez de même pour headers, juste override getHeaders().
si vous regardez PostWithBody class in TestRequest.java dans le Volley-tests, vous trouverez un exemple. Il va quelque chose comme ça
public class LoginRequest extends Request<String> {
    // ... other methods go here
    private Map<String, String> mParams;
    public LoginRequest(String param1, String param2, Listener<String> listener, ErrorListener errorListener) {
        super(Method.POST, "http://test.url", errorListener);
        mListener = listener;
        mParams = new HashMap<String, String>();
        mParams.put("paramOne", param1);
        mParams.put("paramTwo", param2);
    }
    @Override
    public Map<String, String> getParams() {
        return mParams;
    }
}
Evan Charlton a eu la gentillesse de nous montrer comment utiliser volley. https://github.com/evancharlton/folly/
pour les paramètres GET il y a deux alternatives:
premier : comme suggéré dans un commentaire ci-dessous la question, vous pouvez juste utiliser la chaîne et remplacer les paramètres placeholders avec leurs valeurs comme:
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);
où num1 et num2 sont des variables de chaîne qui contiennent vos valeurs.
     Deuxième    : Si vous utilisez    nouvelles HttpClient externe    (4.2.x Par exemple) vous pouvez utiliser URIBuilder pour construire votre Uri. L'avantage est que si votre chaîne de caractères uri contient déjà des paramètres, il sera plus facile de la Passer au  URIBuilder  puis d'utiliser  ub.setQuery(URLEncodedUtils.format(getGetParams(), "UTF-8"));  pour ajouter vos paramètres supplémentaires. De cette façon, vous ne vous embêterez pas à vérifier si "?"est déjà ajouté à l'uri ou à manquer, et donc d'éliminer une source potentielle d'erreurs.  
pour les paramètres de poteau probablement parfois sera plus facile que la réponse acceptée de le faire comme:
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);
 , par exemple pour remplacer simplement la méthode getParams() .  
vous pouvez trouver un exemple de travail (avec beaucoup d'autres exemples de Volley de base) dans le Andorid Volley Examples project .
  CustomRequest est un moyen de résoudre le Jsonobjectrequest de Volley ne peut pas afficher des paramètres comme le  StringRequest   
voici la classe helper qui permet d'ajouter des params:
    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);
    }
}
merci à Greenchiu
cette classe helper gère les paramètres pour GET et POST requests:
import java.io.UnsupportedEncodingException;
import java.util.Iterator;
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 int mMethod;
    private String mUrl;
    private Map<String, String> mParams;
    private Listener<JSONObject> mListener;
    public CustomRequest(int method, String url, Map<String, String> params,
            Listener<JSONObject> reponseListener, ErrorListener errorListener) {
        super(method, url, errorListener);
        this.mMethod = method;
        this.mUrl = url;
        this.mParams = params;
        this.mListener = reponseListener;
    }
@Override
public String getUrl() {
    if(mMethod == Request.Method.GET) {
        if(mParams != null) {
            StringBuilder stringBuilder = new StringBuilder(mUrl);
            Iterator<Map.Entry<String, String>> iterator = mParams.entrySet().iterator();
            int i = 1;
            while (iterator.hasNext()) {
                Map.Entry<String, String> entry = iterator.next();
                if (i == 1) {
                    stringBuilder.append("?" + entry.getKey() + "=" + entry.getValue());
                } else {
                    stringBuilder.append("&" + entry.getKey() + "=" + entry.getValue());
                }
                iterator.remove(); // avoids a ConcurrentModificationException
                i++;
            }
            mUrl = stringBuilder.toString();
        }
    }
    return mUrl;
}
    @Override
    protected Map<String, String> getParams()
            throws com.android.volley.AuthFailureError {
        return mParams;
    };
    @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
        mListener.onResponse(response);
    }
}
 traiter avec  obtenir   paramètres j'ai itéré sur la solution de Andrea Motto.
Le problème était que Volley a appelé  GetUrl  plusieurs fois et sa solution, en utilisant un itérateur, a détruit L'objet original de la carte. Les appels internes subséquents de Volley avaient un objet params vide.  
j'ai ajouté aussi l'encodage des paramètres.
il s'agit d'une utilisation en ligne (pas de sous-classe).
public void GET(String url, Map<String, String> params, Response.Listener<String> response_listener, Response.ErrorListener error_listener, String API_KEY, String stringRequestTag) {
    final Map<String, String> mParams = params;
    final String mAPI_KEY = API_KEY;
    final String mUrl = url;
    StringRequest stringRequest = new StringRequest(
            Request.Method.GET,
            mUrl,
            response_listener,
            error_listener
    ) {
        @Override
        protected Map<String, String> getParams() {
            return mParams;
        }
        @Override
        public String getUrl() {
            StringBuilder stringBuilder = new StringBuilder(mUrl);
            int i = 1;
            for (Map.Entry<String,String> entry: mParams.entrySet()) {
                String key;
                String value;
                try {
                    key = URLEncoder.encode(entry.getKey(), "UTF-8");
                    value = URLEncoder.encode(entry.getValue(), "UTF-8");
                    if(i == 1) {
                        stringBuilder.append("?" + key + "=" + value);
                    } else {
                        stringBuilder.append("&" + key + "=" + value);
                    }
                } catch (UnsupportedEncodingException e) {
                    e.printStackTrace();
                }
                i++;
            }
            String url = stringBuilder.toString();
            return url;
        }
        @Override
        public Map<String, String> getHeaders() {
            Map<String, String> headers = new HashMap<>();
            if (!(mAPI_KEY.equals(""))) {
                headers.put("X-API-KEY", mAPI_KEY);
            }
            return headers;
        }
    };
    if (stringRequestTag != null) {
        stringRequest.setTag(stringRequestTag);
    }
    mRequestQueue.add(stringRequest);
}
cette fonction utilise les en-têtes de passer un APIKEY et définit une BALISE à la demande utile pour l'annuler avant son achèvement.
Espérons que cette aide.
Cela peut vous aider...
private void loggedInToMainPage(final String emailName, final String passwordName) {
    String tag_string_req = "req_login";
    StringRequest stringRequest = new StringRequest(Request.Method.POST, "http://localhost/index", new Response.Listener<String>() {
        @Override
        public void onResponse(String response) {
            Log.d(TAG, "Login Response: " + response.toString());
            try {
                JSONObject jsonObject = new JSONObject(response);
                Boolean error = jsonObject.getBoolean("error");
                if (!error) {
                    String uid = jsonObject.getString("uid");
                    JSONObject user = jsonObject.getJSONObject("user");
                    String email = user.getString("email");
                    String password = user.getString("password");
                    session.setLogin(true);
                    Intent intent = new Intent(getApplicationContext(), MainActivity.class);
                    startActivity(intent);
                    finish();
                    Toast.makeText(getApplicationContext(), "its ok", Toast.LENGTH_SHORT).show();
                }
            } catch (JSONException e) {
                e.printStackTrace();
            }
        }
    }, new Response.ErrorListener() {
        @Override
        public void onErrorResponse(VolleyError volleyError) {
            System.out.println("volley Error .................");
        }
    }) {
        @Override
        protected Map<String, String> getParams() throws AuthFailureError {
            Map<String, String> params = new HashMap<String, String>();
            params.put("tag", "login");
            params.put("email", emailName);
            params.put("password", passwordName);
            return params;
        }
    };
    MyApplication.getInstance().addToRequestQueue(stringRequest,tag_string_req);
}
Pour Les Futurs Lecteurs
j'aime travailler avec les Volley-ball . Pour gagner du temps de développement j'ai essayé d'écrire petite bibliothèque pratique Gloxey Network Manager pour mettre en place Volley avec mon projet. Il inclut JSON parser et différentes autres méthodes qui aident à vérifier la disponibilité du réseau.
  Utiliser  ConnectionManager.class  dans laquelle les différentes méthodes pour    Volley-ball de la Chaîne   et  Volley JSON   demande sont disponibles.
Vous pouvez faire des requêtes de    GET, PUT, POST, DELETE    avec ou sans en-tête. Vous pouvez lire la documentation complète    ici   .  
mettez cette ligne dans votre fichier gradle.
  dependencies { 
       compile 'io.gloxey.gnm:network-manager:1.0.1'
   }
méthode GET (sans en-tête))
    ConnectionManager.volleyStringRequest(context, isDialog, progressDialogView, requestURL, volleyResponseInterface);
     Configuration                Description
     Context                      Context 
     isDialog                     If true dialog will appear, otherwise not.
     progressView                 For custom progress view supply your progress view id and make isDialog true. otherwise pass null. 
     requestURL                   Pass your API URL.  
     volleyResponseInterface      Callback for response.  
exemple
    ConnectionManager.volleyStringRequest(this, false, null, "url", new VolleyResponse() {
    @Override
    public void onResponse(String _response) {
        /**
         * Handle Response
         */
    }
    @Override
     public void onErrorResponse(VolleyError error) {
        /**
         * handle Volley Error
         */
    }
    @Override
    public void isNetwork(boolean connected) {
        /**
         * True if internet is connected otherwise false
         */
    }
});
méthode POST / PUT / DELETE (without header)
    ConnectionManager.volleyStringRequest(context, isDialog, progressDialogView, requestURL, requestMethod, params, volleyResponseInterface);
exemple
Use Method : Request.Method.POST
             Request.Method.PUT
             Request.Method.DELETE
Your params : 
HashMap<String, String> params = new HashMap<>();
params.put("param 1", "value");
params.put("param 2", "value");
ConnectionManager.volleyStringRequest(this, true, null, "url", Request.Method.POST, params, new VolleyResponse() {
    @Override
    public void onResponse(String _response) {
        /**
         * Handle Response
         */
    }
    @Override
    public void onErrorResponse(VolleyError error) {
        /**
         * handle Volley Error
         */
    }
    @Override
    public void isNetwork(boolean connected) {
        /**
         * True if internet is connected otherwise false
         */
    }
});
Bonus
N'hésitez pas à utiliser gloxey JSON parser pour analyser votre réponse api.
  YourModel yourModel = GloxeyJsonParser.getInstance().parse(stringResponse, YourModel.class);
exemple
ConnectionManager.volleyStringRequest(this, false, null, "url", new VolleyResponse() {
    @Override
    public void onResponse(String _response) {
        /**
         * Handle Response
         */
         try {
          YourModel yourModel = GloxeyJsonParser.getInstance().parse(_response, YourModel.class);
            } catch (Exception e) {
                e.printStackTrace();
            }
    }
    @Override
     public void onErrorResponse(VolleyError error) {
        /**
         * handle Volley Error
         */
         if (error instanceof TimeoutError || error instanceof NoConnectionError) {
                showSnackBar(parentLayout, getString(R.string.internet_not_found), getString(R.string.retry), new View.OnClickListener() {
                    @Override
                    public void onClick(View view) {
                     //handle retry button
                    }
                });
            } else if (error instanceof AuthFailureError) {
            } else if (error instanceof ServerError) {
            } else if (error instanceof NetworkError) {
            } else if (error instanceof ParseError) {
            }
    }
    @Override
    public void isNetwork(boolean connected) {
        /**
         * True if internet is connected otherwise false
         */
          if (!connected) {
                showSnackBar(parentLayout, getString(R.string.internet_not_found), getString(R.string.retry), new View.OnClickListener() {
                    @Override
                    public void onClick(View view) {
                        //Handle retry button
                    }
                });
    }
});
     public void showSnackBar(View view, String message) {
            Snackbar.make(view, message, Snackbar.LENGTH_LONG).show();
     }
     public void showSnackBar(View view, String message, String actionText, View.OnClickListener onClickListener) {
            Snackbar.make(view, message, Snackbar.LENGTH_LONG).setAction(actionText, onClickListener).show();
     }
 pour fournir le paramètre POST envoyez votre paramètre comme JSONObject dans le constructeur JsonObjectRequest . Le troisième paramètre accepte un  JSONObject  qui est utilisé dans le corps de la requête.  
JSONObject paramJson = new JSONObject();
paramJson.put("key1", "value1");
paramJson.put("key2", "value2");
JsonObjectRequest jsonObjectRequest = new JsonObjectRequest(Request.Method.POST,url,paramJson,
    new Response.Listener<JSONObject>() {
        @Override
        public void onResponse(JSONObject response) {
        }
    },
    new Response.ErrorListener() {
        @Override
        public void onErrorResponse(VolleyError error) {
        }
    });
requestQueue.add(jsonObjectRequest);