Ich habe eine Google IO 2013-Sitzung über Volley gesehen und denke darüber nach, auf Volley umzusteigen. Unterstützt Volley das Hinzufügen von POST / GET-Parametern zur Anforderung? Wenn ja, wie kann ich das machen?
81
Ich habe eine Google IO 2013-Sitzung über Volley gesehen und denke darüber nach, auf Volley umzusteigen. Unterstützt Volley das Hinzufügen von POST / GET-Parametern zur Anforderung? Wenn ja, wie kann ich das machen?
http://example.com?param1=val1¶m2=val2
)Antworten:
Überschreiben Sie in Ihrer Request-Klasse (die Request erweitert) die Methode getParams (). Sie würden dasselbe für Header tun, überschreiben Sie einfach getHeaders ().
Wenn Sie sich die PostWithBody-Klasse in TestRequest.java in Volley-Tests ansehen, finden Sie ein Beispiel. Es geht so etwas
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 war so freundlich, ein kurzes Beispielprojekt zu erstellen, um uns den Umgang mit Volley zu zeigen. https://github.com/evancharlton/folly/
quelle
getParams
nur (standardmäßig) in einer POST- oder PUT-Anforderung aufgerufen wird , nicht jedoch in einer GET-Anforderung. Siehe Ogre_BGR AntwortFür die GET-Parameter gibt es zwei Alternativen:
Erstens : Wie in einem Kommentar unter der Frage vorgeschlagen, können Sie einfach String verwenden und die Platzhalter für Parameter durch folgende Werte ersetzen:
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);
Dabei sind num1 und num2 String-Variablen, die Ihre Werte enthalten.
Zweitens : Wenn Sie einen neueren externen HttpClient (z. B. 4.2.x) verwenden, können Sie URIBuilder verwenden, um Ihren Uri zu erstellen. Der Vorteil ist, dass wenn Ihre Uri-Zeichenfolge bereits Parameter enthält, es einfacher ist, diese an die zu übergeben
URIBuilder
und dannub.setQuery(URLEncodedUtils.format(getGetParams(), "UTF-8"));
Ihre zusätzlichen Parameter hinzuzufügen. Auf diese Weise müssen Sie nicht überprüfen, ob "?" wird bereits zum uri hinzugefügt oder um einige zu verpassen und eliminiert so eine Quelle für mögliche Fehler.Für die POST-Parameter ist es wahrscheinlich manchmal einfacher als die akzeptierte Antwort, dies wie folgt zu tun:
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);
zB um die
getParams()
Methode einfach zu überschreiben .Ein Arbeitsbeispiel (zusammen mit vielen anderen grundlegenden Volley-Beispielen) finden Sie im Projekt Andorid Volley Examples .
quelle
CustomRequest ist eine Möglichkeit, das JSONObjectRequest des Volleys zu lösen. Es können keine Parameter wie das veröffentlicht werden
StringRequest
Hier ist die Hilfsklasse, mit der Parameter hinzugefügt werden können:
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); } }
danke an Greenchiu
quelle
getParams()
Funktion nicht funktioniert.Diese Hilfsklasse verwaltet Parameter für GET- und POST- Anforderungen:
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); } }
quelle
GetUrl
mehrmals intern anrufen . Am Ende hatten wir einen klassischen foreach-Ansatz, der in einer separaten Antwort veröffentlicht wurde. Hoffe das hilft wer hier landet. :)Umgang mit GET- Parametern Ich habe die Lösung von Andrea Motto wiederholt. Das Problem war, dass Volley anrief
GetUrl
mehrmals anrief und seine Lösung mit einem Iterator das ursprüngliche Kartenobjekt zerstörte. Die nachfolgenden internen Volley-Aufrufe hatten ein leeres params-Objekt.Ich habe auch die Kodierung der Parameter hinzugefügt.
Dies ist eine Inline-Verwendung (keine Unterklasse).
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); }
Diese Funktion verwendet Header, um einen APIKEY zu übergeben, und setzt einen TAG auf die Anforderung, die nützlich ist, um sie vor ihrem Abschluss abzubrechen.
Hoffe das hilft.
quelle
Dies kann Ihnen helfen ...
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); }
quelle
Für zukünftige Leser
Ich liebe es mit Volley zu arbeiten . Um Entwicklungszeit zu sparen, habe ich versucht, eine kleine handliche Bibliothek Gloxey Netwok Manager zu schreiben, um Volley mit meinem Projekt einzurichten . Es enthält JSON-Parser und verschiedene andere Methoden zur Überprüfung der Netzwerkverfügbarkeit.
Verwendung,
ConnectionManager.class
bei der verschiedene Methoden für Volley String- und Volley JSON- Anforderungen verfügbar sind. Sie können GET, PUT, POST, DELETE mit oder ohne Header anfordern . Die vollständige Dokumentation finden Sie hier .Fügen Sie diese Zeile einfach in Ihre Gradle-Datei ein.
dependencies { compile 'io.gloxey.gnm:network-manager:1.0.1' }
Volley StringRequest
Methode GET (ohne Header)
ConnectionManager.volleyStringRequest(context, isDialog, progressDialogView, requestURL, volleyResponseInterface);
Wie benutzt man?
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.
Beispiel
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 */ } });
Volley StringRequest
Methode POST / PUT / DELETE (ohne Header)
ConnectionManager.volleyStringRequest(context, isDialog, progressDialogView, requestURL, requestMethod, params, volleyResponseInterface);
Beispiel
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
Gloxey JSON Parser
Fühlen Sie sich frei, Gloxey JSON Parser zu verwenden, um Ihre API-Antwort zu analysieren.
YourModel yourModel = GloxeyJsonParser.getInstance().parse(stringResponse, YourModel.class);
Beispiel
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(); }
quelle
Um
POST
Parameter bereitzustellen , senden Sie Ihren Parameter wieJSONObject
in an denJsonObjectRequest
Konstruktor. Der dritte Parameter akzeptiert aJSONObject
, das im Anforderungshauptteil verwendet wird.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);
quelle