Управление типами ответов с сервера - PullRequest
0 голосов
/ 30 ноября 2018

Я в замешательстве и надеюсь, что вы поможете мне разрешить это сомнение. Я работаю с методом POST рука об руку с библиотекой Volley, сервер дает мне два типа ответов.

Первый

Если пользователь правильно вводит свои данные, сервер должен выдать мне данные пользователя.Как показано ниже.

Результат запроса пользователя.

Так запрос отправляется на сервер из кода.

 public void getData() {

    StringRequest postRequest = new StringRequest(Request.Method.POST, urlLogin,
            new Response.Listener<String>() {
                @Override
                public void onResponse(String response) {
                    try {

                        JSONObject jsonResponse = new JSONObject(response);
                        System.out.print(jsonResponse);



                    } catch (JSONException e) {

                        e.printStackTrace();
                        Log.d(TAG, String.valueOf(e));
                        Toast.makeText(Login.this,e.toString(),Toast.LENGTH_LONG).show();


                    }
                }
            },
            new Response.ErrorListener() {
                @Override
                public void onErrorResponse(VolleyError error) {
                    error.printStackTrace();
                    Log.d(TAG, String.valueOf(error));
                    Toast.makeText(Login.this,error.toString(),Toast.LENGTH_LONG).show();

                }
            }
    ) {

        @Override
        public String getBodyContentType() {
            return "application/x-www-form-urlencoded; charset=UTF-8";
        }

        // here is params will add to your url using post method
        @Override
        protected Map<String, String> getParams() {
            Map<String, String> params = new HashMap<String, String>();
            params.put("Email", edtEmail.getText().toString());
            params.put("Password", edtPassword.getText().toString());
            return params;
        }
    };

    postRequest.setRetryPolicy(new DefaultRetryPolicy(
            10000,
            DefaultRetryPolicy.DEFAULT_MAX_RETRIES,
            DefaultRetryPolicy.DEFAULT_BACKOFF_MULT));
    requestQueue = Volley.newRequestQueue(this);
    requestQueue.add(postRequest);
    DiskBasedCache cache = new DiskBasedCache(this.getCacheDir(), 500 * 1024 * 1024);
    requestQueue = new RequestQueue(cache, new BasicNetwork(new HurlStack()));
    requestQueue.start();
}

До этого момента все работало замечательно, проблема возникает, когда вы вводите некоторые данные неправильно, потому что сервер не отвечает ни на что абсолютно.

Информация, которая есть.Должно отображаться, вводит ли пользователь какую-либо ошибочную информацию.

Результат при вводе ошибочной информации

Проблема, с которой я сталкиваюсь, заключается в том, что при отправке тех или иных неверных данных серверне отвечает мне никакими типами данных, он только идет напрямую Response.ErrorListener ()

new Response.ErrorListener() { //com.android.volley.ServerError
                @Override
                public void onErrorResponse(VolleyError error) {
                    error.printStackTrace();
                    Log.d(TAG, String.valueOf(error));
                    Toast.makeText(Login.this,error.toString(),Toast.LENGTH_LONG).show();

                }
            }

После прохождения отладки для этой ошибки сообщение «Приложение работает» продолжается, спасибо взаранее, и я надеюсь, что вы можете помочь мне исправить ошибку.

1 Ответ

0 голосов
/ 30 ноября 2018

Вам необходимо спроектировать базовую архитектуру залпа.Так же, как вам нужно создать один базовый класс для каждого запроса, который вы сделали на сервер

abstract class BaseJSONRequest<T> extends Request<T> {

в этом базовом BaseJSONRequest, вам нужно переопределить методы класса запроса залпа

@Override
protected Response<T> parseNetworkResponse(NetworkResponse networkResponse) {
and this below
@Override
public void deliverError(VolleyError error) {

, тогда вам нужноРасширяйте этот запрос BaseJSONRequest для каждого запроса, который вы сделали на сервер. Я приведу один пример ниже.

public class LoginRequest extends BaseJSONRequest<User> {

private final String mUserNamePassword;
private final String mpassword;

public LoginRequest(String userName, String password, boolean byPin, String deviceId, Callback<User> callback) {
    super(Method.GET, NetworkController.URL_LOGIN, createParams(byPin, deviceId), callback);
}

private static HashMap<String, String> createParams(boolean byPin, String deviceId) {
    HashMap<String, String> map = new HashMap<>();
    return map;
}

@Override
public Map<String, String> getHeaders() throws AuthFailureError {

}


@Override
protected User parseData(JSONObject jsonObject) {
    try {

        System.out.println("-Login Request--"+jsonObject);

        return new User(jsonObject.getJSONObject("user"));
    } catch (JSONException e) {
        e.printStackTrace();
    }
    return null;
}

}

...