Дооснащение 2 вызывает сбой, даже если правильные данные поступают с сервера - PullRequest
0 голосов
/ 05 октября 2018

Я застрял в этой точке, когда сервер (сервлет Java) отправляет данные, но модификация всегда вызывает метод onFailure.По другим вопросам, связанным со стековым потоком, я обнаружил, что это ошибка на стороне сервера, когда сервер не отправлял правильные данные json, но я не смог понять, как решить эту проблему.

Мой код Java-сервлета находится здесь

@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response)
        throws ServletException, IOException {

    response.setContentType("application/json");

    System.out.println("Request received");

    try (PrintWriter out = response.getWriter()) {
        String username = request.getParameter(RequestParams.QUERY_USERNAME);
        String password = request.getParameter(RequestParams.QUERY_PASSWORD);

        AccountSignInModel model = new AccountSignInModel(username, password);

        AccountBLL bll = new AccountBLL(); 
        ResultSignInModel result = bll.signIn(model);
        bll.close();
        DetailBLL detailBll = new DetailBLL();
        JSONObject obj = new JSONObject();

        if (result != null) {
            switch (result.getType()) {
            // driver
                case 1:
                    // get driver related record and send back to client
                    DriverBLL driverBll = new DriverBLL();
                    int driverId = driverBll.getDriverId(result.getAccountId());
                    driverBll.close();
                    JSONObject obj1 = detailBll.getDetailOFVehicleAndDriverForOwnerByDriverId(driverId);
                    obj = new JsonModelConverter(obj1).getSignInModel(true);
                    break;
            // agency
                case 0:
                    // get agency related record and send back to client
                    AgencyBLL agencyBll = new AgencyBLL();
                    int agencyId = agencyBll.getAgencyId(result.getAccountId());
                    agencyBll.close();
                    JSONObject obj2 = detailBll.getDetailOfAgencyForOwner(agencyId);
                    obj = new JsonModelConverter(obj2).getSignInModel(false);
                    break;
                default:
                    response.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
                    throw new NoSuchObjectException("No Data Found");
            }
            detailBll.close();
            out.println(obj);
        }
        else {
            // invailid username or password
            response.sendError(HttpServletResponse.SC_UNAUTHORIZED);
        }
    } catch (ClassNotFoundException | SQLException ex) {
        Logger.getLogger(SignIn.class.getName()).log(Level.SEVERE, null, ex);
    }
}

Ответ, который генерирует сервер, таков (для типа пользователя 1)

{
"driverVehicleModel": {
    "address": {
        "hometown": "Lahore",
        "phone": "3648434548",
        "city": "Lahore",
        "localAddress": "Lahore"
    },
    "name": "Corolla",
    "account": {
        "username": "j"
    },
    "vehicle": {
        "vehicleColor": "White",
        "vehicleName": "Corolla",
        "vehiclePower": "1600 cc",
        "vehicleModel": "2018",
        "vehicleNumber": "khs 765",
        "id": 102,
        "vehicleType": "Car"
    }
},
"agencyModel": ""
}

А для типа пользователя 0 он отвечает на этот ответ

{
"driverVehicleModel":"",
"agencyModel": {
    "numOfVehicles":65,
    "address": {
        "hometown":"Gujranwala",
        "phone":"3465544",
        "city":"Gujranwala",
        "localAddress":"Gujranwala"
    },
    "id":41,
    "managerName":"shami",
    "account": {
        "username":"ssss"
    },
    "agencyName":"shami"
}
}

Сторона моего клиента (Android)) код здесь

Метод интерфейса для входа в систему

@POST(RequestParams.PATH_LOGIN)
Call<SignInModel> signIn(
        @Query(RequestParams.QUERY_USERNAME) String username,
        @Query(RequestParams.QUERY_PASSWORD) String password
);

SignInModel

public class SignInModel implements Serializable {

private DriverVehicleModel driverVehicleModel;
private AgencyModel agencyModel;

public SignInModel() {
}

public SignInModel(DriverVehicleModel driverVehicleModel, AgencyModel agencyModel) {
    this.driverVehicleModel = driverVehicleModel;
    this.agencyModel = agencyModel;
}

public SignInModel(AgencyModel agencyModel) {
    this.agencyModel = agencyModel;
}

public SignInModel(DriverVehicleModel driverVehicleModel) {
    this.driverVehicleModel = driverVehicleModel;
}

public DriverVehicleModel getDriverVehicleModel() {
    return driverVehicleModel;
}

public void setDriverVehicleModel(DriverVehicleModel driverVehicleModel) {
    this.driverVehicleModel = driverVehicleModel;
}

public AgencyModel getAgencyModel() {
    return agencyModel;
}

public void setAgencyModel(AgencyModel agencyModel) {
    this.agencyModel = agencyModel;
}
}

Мой вызов API здесь

@OnClick(R.id.btn_sign)
public void btnSigClick(View view) {
    attemptLogin();
}

private void attemptLogin() {

    // Store values at the time of the login attempt.
    String email = etEmail.getText().toString();
    String password = etPassword.getText().toString();

    if (email.equals("") || password.equals("")) {
        Toast.makeText(this, "Enter valid information", Toast.LENGTH_SHORT).show();
    } else {

        try {
            password = Security.encryptPassword(password);
        } catch (NoSuchAlgorithmException e) {
            Toast.makeText(this, "Encryption error", Toast.LENGTH_SHORT).show();
            return;
        }

        DefaultClient client = ServiceGenerator.createClient(DefaultClient.class);
        Call<SignInModel> signInCall = client.signIn(
                email,
                password
        );
        signInCall.enqueue(new Callback<SignInModel>() {
            @Override
            public void onResponse(Call<SignInModel> call, Response<SignInModel> response) {

                SignInModel signInModel = response.body();

                DriverVehicleModel driverVehicleModel = signInModel.getDriverVehicleModel();
                AgencyModel agencyModel = signInModel.getAgencyModel();

                Intent intent = new Intent(LoginActivity.this, DetailActivity.class);
                Bundle bundle = new Bundle();
                SharedPreferences.Editor editor = getSharedPreferences(AppConstants.SHARED_PREFERENCE_NAME, MODE_PRIVATE).edit();

                if (agencyModel != null) {
                    // agency
                    editor.putInt(AppConstants.KEY_ID, agencyModel.getId());
                    editor.putInt(AppConstants.KEY_TYPE, 0);
                    editor.apply();

                    bundle.putInt(AppConstants.DATA_TO_SHOW, 0);
                    bundle.putInt(AppConstants.KEY_ID, agencyModel.getId());

                    intent.putExtra(AppConstants.KEY_DATA, bundle);
                    startActivity(intent);
                }

                else if (driverVehicleModel != null) {
                    // driver
                    editor.putInt(AppConstants.KEY_ID, driverVehicleModel.getVehicle().getId());
                    editor.putInt(AppConstants.KEY_TYPE, 1);
                    editor.apply();

                    bundle.putInt(AppConstants.DATA_TO_SHOW, 1);
                    bundle.putInt(AppConstants.KEY_ID, driverVehicleModel.getVehicle().getId());

                    intent.putExtra(AppConstants.KEY_DATA, bundle);
                    startActivity(intent);
                }

                else {
                    Toast.makeText(LoginActivity.this, "Invailid username or password", Toast.LENGTH_SHORT).show();
                }
            }

            @Override
            public void onFailure(Call<SignInModel> call, Throwable t) {
                Log.d(TAG, t.getMessage());
                Toast.makeText(LoginActivity.this, "Failed to connect. Please check the internet connection" + t.getMessage(), Toast.LENGTH_SHORT).show();
            }
        });
    }
}

Все остальные модели - это сервер, генерирующий ответ.

Что не так и как мне это исправить.Я успешно потратил на это больше 1 дня.Пожалуйста, помогите.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...