Volley – Paramètres POST / GET

J’ai vu la session de Google IO 2013 à propos de Volley et j’envisage de passer à la volée. Volley prend-il en charge l’ajout de parameters POST / GET à la demande? Si oui, comment puis-je le faire?

Dans votre classe Request (qui étend Request), remplacez la méthode getParams (). Vous feriez la même chose pour les en-têtes, remplacez simplement getHeaders ().

Si vous regardez la classe PostWithBody dans TestRequest.java dans les tests Volley, vous trouverez un exemple. Ca fait plutot comme ca

 public class LoginRequest extends Request { // ... other methods go here private Map mParams; public LoginRequest(Ssortingng param1, Ssortingng param2, Listener listener, ErrorListener errorListener) { super(Method.POST, "http://test.url", errorListener); mListener = listener; mParams = new HashMap(); mParams.put("paramOne", param1); mParams.put("paramTwo", param2); } @Override public Map getParams() { return mParams; } } 

Evan Charlton a eu la gentillesse de faire un rapide exemple de projet pour nous montrer comment utiliser la volée. https://github.com/evancharlton/folly/

Pour les parameters GET, il existe deux alternatives:

Premièrement : Comme suggéré dans un commentaire ci-dessous, vous pouvez simplement utiliser Ssortingng et remplacer les parameters par des espaces tels que:

 Ssortingng uri = Ssortingng.format("http://somesite.com/some_endpoint.php?param1=%1$s&param2=%2$s", num1, num2); SsortingngRequest myReq = new SsortingngRequest(Method.GET, uri, createMyReqSuccessListener(), createMyReqErrorListener()); queue.add(myReq); 

où num1 et num2 sont des variables Ssortingng qui contiennent vos valeurs.

Deuxièmement : si vous utilisez un HttpClient externe plus récent ( 4.2.x par exemple), vous pouvez utiliser URIBuilder pour créer votre Uri. L’avantage est que si votre chaîne d’URI contient déjà des parameters, il sera plus facile de la transmettre à URIBuilder , puis d’utiliser ub.setQuery(URLEncodedUtils.format(getGetParams(), "UTF-8")); pour append vos parameters supplémentaires. De cette façon, vous ne voudrez pas vérifier si “?” est déjà ajouté à l’URI ou à en manquer et élimine ainsi une source d’erreurs potentielles.

Car les parameters POST seront probablement parfois plus faciles que la réponse acceptée pour le faire comme:

 SsortingngRequest myReq = new SsortingngRequest(Method.POST, "http://somesite.com/some_endpoint.php", createMyReqSuccessListener(), createMyReqErrorListener()) { protected Map getParams() throws com.android.volley.AuthFailureError { Map params = new HashMap(); params.put("param1", num1); params.put("param2", num2); return params; }; }; queue.add(myReq); 

Par exemple, pour simplement remplacer la méthode getParams() .

Vous pouvez trouver un exemple de travail (avec de nombreux autres exemples de base de Volley) dans le projet Andorid Volley Examples .

CustomRequest est un moyen de résoudre le JSONObjectRequest de Volley ne peut pas poster des parameters tels que SsortingngRequest

Voici la classe d’assistance qui permet d’append des parameters:

  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(Ssortingng url, Map params, Listener reponseListener, ErrorListener errorListener) { super(Method.GET, url, errorListener); this.listener = reponseListener; this.params = params; } public CustomRequest(int method, Ssortingng 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 { Ssortingng jsonSsortingng = new Ssortingng(response.data, HttpHeaderParser.parseCharset(response.headers)); return Response.success(new JSONObject(jsonSsortingng), 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); } } 

grâce à Greenchiu

Cette classe d’assistance gère les parameters des requêtes GET et POST :

 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 { private int mMethod; private Ssortingng mUrl; private Map mParams; private Listener mListener; public CustomRequest(int method, Ssortingng url, Map params, Listener reponseListener, ErrorListener errorListener) { super(method, url, errorListener); this.mMethod = method; this.mUrl = url; this.mParams = params; this.mListener = reponseListener; } @Override public Ssortingng getUrl() { if(mMethod == Request.Method.GET) { if(mParams != null) { SsortingngBuilder ssortingngBuilder = new SsortingngBuilder(mUrl); Iterator> iterator = mParams.entrySet().iterator(); int i = 1; while (iterator.hasNext()) { Map.Entry entry = iterator.next(); if (i == 1) { ssortingngBuilder.append("?" + entry.getKey() + "=" + entry.getValue()); } else { ssortingngBuilder.append("&" + entry.getKey() + "=" + entry.getValue()); } iterator.remove(); // avoids a ConcurrentModificationException i++; } mUrl = ssortingngBuilder.toSsortingng(); } } return mUrl; } @Override protected Map getParams() throws com.android.volley.AuthFailureError { return mParams; }; @Override protected Response parseNetworkResponse(NetworkResponse response) { try { Ssortingng jsonSsortingng = new Ssortingng(response.data, HttpHeaderParser.parseCharset(response.headers)); return Response.success(new JSONObject(jsonSsortingng), 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 les parameters GET , je l’ai répété sur la solution d’Andrea Motto. Le problème était que Volley appelait GetUrl plusieurs fois et que sa solution, utilisant un Iterator, détruisait l’object Map d’origine. Les appels internes suivants de Volley avaient un object parameters vide.

J’ai également ajouté l’encodage des parameters.

Ceci est une utilisation en ligne (pas de sous-classe).

 public void GET(Ssortingng url, Map params, Response.Listener response_listener, Response.ErrorListener error_listener, Ssortingng API_KEY, Ssortingng ssortingngRequestTag) { final Map mParams = params; final Ssortingng mAPI_KEY = API_KEY; final Ssortingng mUrl = url; SsortingngRequest ssortingngRequest = new SsortingngRequest( Request.Method.GET, mUrl, response_listener, error_listener ) { @Override protected Map getParams() { return mParams; } @Override public Ssortingng getUrl() { SsortingngBuilder ssortingngBuilder = new SsortingngBuilder(mUrl); int i = 1; for (Map.Entry entry: mParams.entrySet()) { Ssortingng key; Ssortingng value; try { key = URLEncoder.encode(entry.getKey(), "UTF-8"); value = URLEncoder.encode(entry.getValue(), "UTF-8"); if(i == 1) { ssortingngBuilder.append("?" + key + "=" + value); } else { ssortingngBuilder.append("&" + key + "=" + value); } } catch (UnsupportedEncodingException e) { e.printStackTrace(); } i++; } Ssortingng url = ssortingngBuilder.toSsortingng(); return url; } @Override public Map getHeaders() { Map 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 des en-têtes pour passer une APIKEY et définit un TAG sur la requête utile pour l’annuler avant sa fin.

J’espère que cela t’aides.

Cela peut vous aider …

 private void loggedInToMainPage(final Ssortingng emailName, final Ssortingng passwordName) { Ssortingng tag_ssortingng_req = "req_login"; SsortingngRequest ssortingngRequest = new SsortingngRequest(Request.Method.POST, "http://localhost/index", new Response.Listener() { @Override public void onResponse(Ssortingng response) { Log.d(TAG, "Login Response: " + response.toSsortingng()); try { JSONObject jsonObject = new JSONObject(response); Boolean error = jsonObject.getBoolean("error"); if (!error) { Ssortingng uid = jsonObject.getSsortingng("uid"); JSONObject user = jsonObject.getJSONObject("user"); Ssortingng email = user.getSsortingng("email"); Ssortingng password = user.getSsortingng("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 getParams() throws AuthFailureError { Map params = new HashMap(); params.put("tag", "login"); params.put("email", emailName); params.put("password", passwordName); return params; } }; MyApplication.getInstance().addToRequestQueue(ssortingngRequest,tag_ssortingng_req); } 

Pour les futurs lecteurs

J’aime travailler avec Volley . Pour gagner du temps de développement, j’ai essayé d’écrire une petite bibliothèque pratique Gloxey Netwok Manager pour configurer Volley avec mon projet. Il comprend un parsingur JSON et différentes autres méthodes permettant de vérifier la disponibilité du réseau.

Utilisez ConnectionManager.class dans lequel différentes méthodes pour les requêtes Volley Ssortingng et Volley JSON 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 .

Il suffit de mettre cette ligne dans votre fichier de gradle.

  dependencies { comstack 'io.gloxey.gnm:network-manager:1.0.1' } 

Volley SsortingngRequest

Méthode GET (sans en-tête)

  ConnectionManager.volleySsortingngRequest(context, isDialog, progressDialogView, requestURL, volleyResponseInterface); 

Comment utiliser?

  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.volleySsortingngRequest(this, false, null, "url", new VolleyResponse() { @Override public void onResponse(Ssortingng _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 */ } }); 

Volley SsortingngRequest

Méthode POST / PUT / DELETE (sans en-tête)

  ConnectionManager.volleySsortingngRequest(context, isDialog, progressDialogView, requestURL, requestMethod, params, volleyResponseInterface); 

Exemple

 Use Method : Request.Method.POST Request.Method.PUT Request.Method.DELETE Your params : HashMap 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 */ } }); 

Prime

Gloxey JSON Parser

N’hésitez pas à utiliser l’parsingur gloxey json pour parsingr votre réponse api.

  YourModel yourModel = GloxeyJsonParser.getInstance().parse(ssortingngResponse, YourModel.class); 

Exemple

 ConnectionManager.volleySsortingngRequest(this, false, null, "url", new VolleyResponse() { @Override public void onResponse(Ssortingng _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, getSsortingng(R.ssortingng.internet_not_found), getSsortingng(R.ssortingng.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, getSsortingng(R.ssortingng.internet_not_found), getSsortingng(R.ssortingng.retry), new View.OnClickListener() { @Override public void onClick(View view) { //Handle retry button } }); } }); public void showSnackBar(View view, Ssortingng message) { Snackbar.make(view, message, Snackbar.LENGTH_LONG).show(); } public void showSnackBar(View view, Ssortingng message, Ssortingng 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 en tant que JSONObject dans le constructeur JsonObjectRequest . Le troisième paramètre accepte un object JSONObject 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() { @Override public void onResponse(JSONObject response) { } }, new Response.ErrorListener() { @Override public void onErrorResponse(VolleyError error) { } }); requestQueue.add(jsonObjectRequest);