Запросить исходные данные с помощью Volley [duplicate]

Используйте функцию compare , чтобы выполнить это.

67
задан Gaurav Agarwal 19 May 2013 в 18:44
поделиться

8 ответов

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

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

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

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

59
ответ дан Jon Adams 20 August 2018 в 18:39
поделиться
  • 1
    Обратите внимание, что getParams вызывается (по умолчанию) только в запросе POST или PUT, , но не в запросе GET. См. Ответ Ogre_BGR – Itai Hanski 29 August 2013 в 11:44
  • 2
    Не могу поверить, что я никогда не замечал этого до сих пор – AfzalivE 29 August 2013 в 17:03
  • 3
    @AfzalivE, любая идея о том, как подписать API-запрос с OAuth при использовании вышеуказанного кода? – Bipin Vayalu 1 October 2013 в 14:17
  • 4
    @BipinVayalu Если вы подключаетесь к Google API, вы можете использовать com.android.volley.AndroidAuthenticator – Pierre-Antoine 7 December 2013 в 17:52
  • 5
    Вы забыли создать экземпляр mParams. – Moritz 15 August 2014 в 11:38

Чтобы предоставить параметр 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<JSONObject>() {
        @Override
        public void onResponse(JSONObject response) {

        }
    },
    new Response.ErrorListener() {
        @Override
        public void onErrorResponse(VolleyError error) {

        }
    });
requestQueue.add(jsonObjectRequest);
0
ответ дан Abu Yousuf 20 August 2018 в 18:39
поделиться

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

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

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

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

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

Бонус

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();
     }
1
ответ дан Adnan Bin Mustafa 20 August 2018 в 18:39
поделиться

Этот вспомогательный класс управляет параметрами для запросов 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<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);
    }
}
7
ответ дан Andrea Motto 20 August 2018 в 18:39
поделиться
  • 1
    Это решает добавить параметры к методу GET, спасибо! – pkarc 13 January 2016 в 17:45
  • 2
    В нашем случае подход итератора уничтожил исходный объект param карты, который мы передали функции. Кажется, Volley внутренне вызывает GetUrl несколько раз. Мы получили классический подход foreach, который был опубликован в отдельном ответе. Надеюсь, это поможет нам приземлиться здесь. :) – Paolo Casciello 19 April 2016 в 16:04
  • 3
    Как вызвать этот вспомогательный класс для запроса запроса с тремя параметрами – kgandroid 26 April 2018 в 19:13
  • 4
    @kgandroid, создайте карту & lt; String, String & gt; с вашими ключами и значениями. Пример: Map & lt; String, String & gt; params = new HashMap & lt; String, String & gt; (); params.put ("param1", "value1"); params.put ("param2", "value2"); params.put ("param3", "value3"); – Andrea Motto 26 April 2018 в 23:53

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

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);
}
3
ответ дан Mahbod 20 August 2018 в 18:39
поделиться

Для параметров 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 уже имеет параметры в ней, будет проще передать ее в URIBuilder, а затем использовать ub.setQuery(URLEncodedUtils.format(getGetParams(), "UTF-8"));, чтобы добавить ваши дополнительные параметры. Таким образом, вы не потрудитесь проверить, есть ли "?" уже добавлен в uri или пропустить некоторые & amp; таким образом устраняя источник потенциальных ошибок.

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

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

, например. для просто переопределения метода getParams().

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

70
ответ дан Ognyan 20 August 2018 в 18:39
поделиться
  • 1
    Я следил за твоими примерами волейбола. Пока это самый полезный код Volly, но у меня есть проблемы в JsonObjectRequest. Я получил старый ответ в createMyReqSuccessListener, пока не переустановит его снова. Являются ли данные хранилища в кэше? Пожалуйста, предложите способ сделать это. – SkyWalker 16 January 2014 в 16:02
  • 2
    Сохраняются только изображения. Проверьте, есть ли какой-либо прокси-сервер, который перехватывает ваши запросы. Если запросы имеют точно такой же URL-адрес, и возможно, что прокси-сервер просто возвращает первый результат. – Ognyan 16 January 2014 в 16:23
  • 3
    Существует плагин для Firefox, называемый «HTTP-ресурсный тест». что позволяет отправлять запросы снова на веб-сервер. Это очень полезно для тестирования таких случаев. Просто введите свой URL (и параметры POST, если таковые имеются) и посмотрите, что ответ сервера для нескольких последовательных запросов. Если снова вы получите тот же результат ответа, скорее всего, кэшируется. В этом случае вы можете проверить возвращенные заголовки, чтобы проверить, есть ли заголовки прокси. Об «без кэша» - Да, это должно сработать. – Ognyan 16 January 2014 в 16:34
  • 4
    Я предлагаю вам открыть отдельный вопрос, чтобы другие могли присоединиться и помочь. Пожалуйста, сообщите, какой стек вы используете HURL или HttpClient, а также версию Android, с которой вы тестируете. Пожалуйста, поместите здесь ссылку на новый вопрос, чтобы люди могли следить за обсуждением. – Ognyan 17 January 2014 в 10:30
  • 5
    @Yousif Вероятно, вы получите намного лучшие ответы, если вы зададите это как новый вопрос, но вкратце: запрос POST позволяет отправлять файлы и другие более крупные данные, которые не будут соответствовать запросу GET. Также существует риск безопасности при использовании запроса GET, потому что URL может регистрироваться на сервере, тем самым подвергая конфиденциальные данные. – Ognyan 4 July 2015 в 10:14

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

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

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

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

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

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

4
ответ дан Paolo Casciello 20 August 2018 в 18:39
поделиться

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

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

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

}

благодаря Greenchiu

19
ответ дан Rahul 20 August 2018 в 18:39
поделиться
  • 1
    @WarrenFaith Спасибо за указание, я обновил ответ! – LOG_TAG 3 September 2013 в 06:39
  • 2
    Большое спасибо, я искал часы, прежде чем я получу это решение. Это настолько странно, что переопределение функции JSONObjectRequest getParams() не работает. – Mohammad Walid 3 July 2014 в 18:47
  • 3
    @MohammadWalid FYI прочитайте это stackoverflow.com/questions/16902716/… и попробуйте использовать модификацию! и волейбол, и модификация могут использоваться с okhttp! – LOG_TAG 4 July 2014 в 05:15
Другие вопросы по тегам:

Похожие вопросы: