Я застрял в этой точке, когда сервер (сервлет 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 дня.Пожалуйста, помогите.