Параметры Volley – POST / GET

Я видел сессию Google IO 2013 о Volley, и я подумываю переключиться на залп. Поддерживает ли Volley добавление параметров POST / GET для запроса? Если да, как я могу это сделать?

    В вашем classе «Запрос» (который расширяет запрос) переопределите метод getParams (). Вы бы сделали то же самое для заголовков, просто переопределите getHeaders ().

    Если вы посмотрите на class PostWithBody в TestRequest.java в тестах Volley, вы найдете пример. Это выглядит примерно так

     public class LoginRequest extends Request { // ... other methods go here private Map mParams; public LoginRequest(String param1, String 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; } } 

    Эван Чарлтон был достаточно любезен, чтобы сделать быстрый пример проекта, чтобы показать нам, как использовать залп. https://github.com/evancharlton/folly/

    Для параметров GET существуют две альтернативы:

    Во-первых : Как было предложено в комментарии к вопросу, вы можете просто использовать String и заменить параметры заполнителями такими значениями, как:

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

    где num1 и num2 – это переменные String, которые содержат ваши значения.

    Второе : если вы используете более новый внешний HttpClient (например, 4.2.x), вы можете использовать URIBuilder для создания своего Uri. Преимущество состоит в том, что если ваша строка uri уже имеет параметры в ней, будет проще передать ее URIBuilder а затем использовать ub.setQuery(URLEncodedUtils.format(getGetParams(), "UTF-8")); для добавления дополнительных параметров. Таким образом, вы не потрудитесь проверить, есть ли “?” уже добавлен в uri или пропустить некоторые и тем самым исключить источник возможных ошибок.

    Для параметров POST, вероятно, иногда будет проще, чем принятый ответ:

     StringRequest myReq = new StringRequest(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); 

    например, чтобы просто переопределить метод getParams() .

    Вы можете найти рабочий пример (наряду со многими другими основными примерами Волей) в проекте Andorid Volley Examples .

    CustomRequest – это способ решить, что JSONObjectRequest волейбола не может публиковать такие параметры, как StringRequest

    вот вспомогательный class, который позволяет добавлять параметры:

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

    благодаря Гринкиу

    Этот class-помощник управляет параметрами запросов GET и 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 String mUrl; private Map mParams; private Listener mListener; public CustomRequest(int method, String 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 String getUrl() { if(mMethod == Request.Method.GET) { if(mParams != null) { StringBuilder stringBuilder = new StringBuilder(mUrl); Iterator> iterator = mParams.entrySet().iterator(); int i = 1; while (iterator.hasNext()) { Map.Entry 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 getParams() throws com.android.volley.AuthFailureError { return mParams; }; @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 mListener.onResponse(response); } } 

    Работа с параметрами GET я повторил по решению Андреа Мотто. Проблема заключалась в том, что Volley вызвал GetUrl несколько раз, и его решение, используя Итератор, уничтожило оригинальный объект Map. Последующие внутренние вызовы Volley имели пустой объект params.

    Я добавил также кодировку параметров.

    Это встроенное использование (без подclassа).

     public void GET(String url, Map params, Response.Listener response_listener, Response.ErrorListener error_listener, String API_KEY, String stringRequestTag) { final Map 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 getParams() { return mParams; } @Override public String getUrl() { StringBuilder stringBuilder = new StringBuilder(mUrl); int i = 1; for (Map.Entry 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 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); } 

    Эта функция использует заголовки для передачи APIKEY и устанавливает TAG для запроса, полезного для его отмены до его завершения.

    Надеюсь это поможет.

    Это может помочь вам …

     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() { @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 getParams() throws AuthFailureError { Map params = new HashMap(); params.put("tag", "login"); params.put("email", emailName); params.put("password", passwordName); return params; } }; MyApplication.getInstance().addToRequestQueue(stringRequest,tag_string_req); } 

    Для будущих читателей

    Я люблю работать с Волей . Чтобы сэкономить время разработки, я попытался написать небольшую удобную библиотеку Gloxey Netwok Manager для настройки Volley с моим проектом. Он включает парсер JSON и другие методы, которые помогают проверять доступность сети.

    Используйте ConnectionManager.class в котором доступны различные методы для запроса Volley String и Volley JSON . Вы можете делать запросы GET, PUT, POST, DELETE с заголовком или без него. Здесь вы можете прочитать полную документацию.

    Просто поместите эту строку в свой файл gradle.

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

    Volley StringRequest

    Метод GET (без заголовка)

      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. 

    пример

      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

    Метод POST / PUT / DELETE (без заголовка)

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

    пример

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

    бонус

    Gloxey JSON Parser

    Не стесняйтесь использовать gloxey json parser для анализа вашего ответа api.

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

    пример

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

    Чтобы предоставить параметр POST отправьте свой параметр как JSONObject в конструктор JsonObjectRequest . Третий параметр принимает объект JSONObject который используется в теле запроса.

     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); 
    Давайте будем гением компьютера.