Залп не может получить ошибку от сервера, но показывает мне слушатель ошибки залп, почему? - PullRequest
0 голосов
/ 28 апреля 2020

Мне нужна помощь в устранении ошибки библиотеки залпа. Я отправил некоторые учетные данные на сервер, используя nodejs api для регистрации пользователя. В случае успеха, когда все мои учетные данные уникальны для создания новой учетной записи пользователя, он показывает мне все правильно, все ответы и т. Д. c. Но когда я отправляю несколько дубликатов учетных данных, то есть, электронная почта нового пользователя совпадает с электронной почтой другого пользователя, она не может показать мне ошибку сервера, которую я получил в ответ от сервера, использующего проверки, но она показывает мне ошибку прослушивателя залповой ошибки.

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

Код приведен ниже:

  register.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {

                if (firstName.getText().toString().isEmpty() || firstName.getText().toString().length() <= 3){
                    Toast.makeText(getContext(), "First name length is too short", Toast.LENGTH_SHORT).show();
                }
                else if (lastName.getText().toString().isEmpty() || lastName.getText().toString().length() <= 2){
                    Toast.makeText(getContext(), "Last name length is too short", Toast.LENGTH_SHORT).show();
                }
                else if (emailUser.getText().toString().isEmpty() || !emailUser.getText().toString().trim().matches(emailPattern)){
                    Toast.makeText(getContext(), "Enter valid email address", Toast.LENGTH_SHORT).show();
                }
                else if (mobileNumber.getText().toString().isEmpty() || mobileNumber.getText().toString().length() <= 8){
                    Toast.makeText(getContext(), "Enter valid mobile number", Toast.LENGTH_SHORT).show();
                }
                else if (dobUser.getText().toString().isEmpty()){
                    Toast.makeText(getContext(), "Select date of birth", Toast.LENGTH_SHORT).show();
                }
                else if (genderUser.getText().toString().isEmpty()){
                    Toast.makeText(getContext(), "Select gender", Toast.LENGTH_SHORT).show();
                }
                else if (passwordUser.getText().toString().isEmpty() || !passwordUser.getText().toString().trim().matches(PASSWORD_PATTERN)){
                    Toast.makeText(getContext(), "Enter valid password.Password must be 1 special character 1 lower letter and 1 Upper letter and 1 Number digit", Toast.LENGTH_SHORT).show();
                }
                else {
                    registerUser();
                }

            }
        });

Вот функция где ошибка не может правильно показать, что я хочу, я также использую проверку в коде:

private void registerUser() {

            final ProgressDialog progress = new ProgressDialog(getContext());
            progress.setTitle("Register Account");
            progress.setMessage("Loading...");
            progress.setCancelable(false);
            progress.show();

            RequestQueue queue = Volley.newRequestQueue(getContext());

            final JSONObject jsonObject = new JSONObject();
            try {
                jsonObject.put("first_name", firstName.getText().toString());
                jsonObject.put("last_name",lastName.getText().toString());
                jsonObject.put("email", emailUser.getText().toString());
                jsonObject.put("password", passwordUser.getText().toString());
                jsonObject.put("gender",genderUser.getText().toString());
                jsonObject.put("phone_number", mobileNumber.getText().toString());
                jsonObject.put("date_of_birth", dobUser.getText().toString());

                JsonObjectRequest jsonRequest = new JsonObjectRequest(Request.Method.POST, url, jsonObject,
                        new Response.Listener<JSONObject>() {
                            @Override
                            public void onResponse(JSONObject response) {

                                try {
                                    String status = response.getString("status");
                                    String message = response.getString("message");

                                    if (status.equals("Success")){
                                        progress.dismiss();
                                        Toast.makeText(getContext(), response.toString(), Toast.LENGTH_SHORT).show();
                                    }
                                    else if (status.equals("Fail")){
                                        JSONArray jsonArray = response.getJSONArray("data");
                                        JSONObject jsonObject1 = jsonArray.getJSONObject(0);
                                        String error = jsonObject1.getString("error");
                                        progress.dismiss();
                                        Toast.makeText(getContext(), error.toString(), Toast.LENGTH_SHORT).show();

                                    }
                                    else {

                                        progress.dismiss();
                                        Toast.makeText(getContext(), "Something went wrong.Please try again", Toast.LENGTH_SHORT).show();

                                    }

                                } catch (JSONException e) {
                                    e.printStackTrace();
                                    Toast.makeText(getContext(), e.toString(), Toast.LENGTH_SHORT).show();
                                }

                            }
                        }, new Response.ErrorListener() {
                    @Override
                    public void onErrorResponse(VolleyError error) {
                        progress.dismiss();
                        Toast.makeText(getContext(), "Email or mobile number already used by other account.", Toast.LENGTH_SHORT).show();
                        error.printStackTrace();
                    }
                }) {
                    @Override
                    public Map<String, String> getHeaders() {
                        Map<String, String> params = new HashMap<String, String>();
                        params.put("Content-Type", "application/json");
                        return params;
                    }
                };

//                RequestQueue queue = Volley.newRequestQueue(LoginActivity.this);
//                queue.add(request);

                queue.add(jsonRequest);


            } catch (JSONException e) {
                e.printStackTrace();
                Toast.makeText(getContext(), "Here is the error", Toast.LENGTH_SHORT).show();
            }


        }

Это ошибка json ответ от сервера:

{
    "status": "Fail",
    "message": "Invalid Request",
    "data": [
        {
            "error": "Email already used by another account!"
        }
    ]
}

1 Ответ

0 голосов
/ 28 апреля 2020

Это строка, которую я имею в моем методе onErrorResponse

            String result = Global.parseError(error.networkResponse.statusCode, error.networkResponse.data);

Это то, что у меня есть в моем методе parseError.

  public static String parseError(int responseCode, byte[] data) {

    StringBuilder stringBuilder = new StringBuilder();

    if (data == null)
        return null;
    else {

        if (responseCode == 400 || responseCode == 401 || responseCode == 402 || responseCode == 403 || responseCode == 404) {
            String string = new String(data);
            Log.d(TAG, "parseError: "+string);
            try {
                JSONObject jsonObject = new JSONObject(string);
                Log.d(TAG, "parseError: " + jsonObject);
                if (jsonObject.has("message") && !jsonObject.isNull("message"))
                    stringBuilder.append(jsonObject.getString("message"));

                if (jsonObject.has("result") && !jsonObject.isNull("result")) {

                    JSONObject resultObj = jsonObject.getJSONObject("result");

                    if (resultObj.has("errors") && !resultObj.isNull("errors")) {
                        JSONArray errorsArray = resultObj.getJSONArray("errors");

                        if (errorsArray.length() > 0) {
                            JSONObject errObj = errorsArray.getJSONObject(0);
                            if (errObj.has("message") && !errObj.isNull("message"))
                                return stringBuilder.append(errObj.getString("message")).toString();
                        }
                    }
                }
                return stringBuilder.toString();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }else{
            return String.valueOf(stringBuilder.append("We are facing server issues please try again."));
        }

    }

    return null;
}

Обратите внимание, что этот statusCode выдаст вам int ошибки код может быть 400, 401 и т. д.

error.networkResponse.statusCode

, и это даст вам ответ об ошибке, если он присутствует.

error.networkResponse.data

в вашей ситуации попробуйте распечатать данные и посмотреть, если вы получаете код состояния и данные, если у вас есть обе вещи, то вы можете написать свой метод для анализа ошибки, как я сделал в соответствии с вашей ошибкой формат сообщения.

...