prumin
@prumin
Изучаю Java и мобильную разработку

Почему не возвращается информация?

Ситуация такая, пытаюсь постичь spark и retrofit2. Есть база на сервере, я пытаюсь создать авторизацию,
Сделал rest сервис:
get("/getUser/:user",(request,response)-> {
            response.type("application/json");
            Account acc = gson.fromJson(request.params(":user"), Account.class);
            return getUser(acc);
        }, gson ::toJson);

getUser() :
private static Info getUser(Account acc) throws ClassNotFoundException, SQLException, UnsupportedEncodingException, NoSuchAlgorithmException {
        Connection c;
        Statement stm = null;
        Class.forName("org.postgresql.Driver");
        c = DriverManager.getConnection("jdbc:postgresql://<myIP>:5432/egecalc", "postgres", "itsMyAppBitches");
        String sql = "select * from users;";
        Info result = null;
        String hash = getHash(acc.getPassword());
        stm = c.createStatement();
        ResultSet rs = stm.executeQuery(sql);
        while (rs.next()) {
            if (rs.getString("username").equals(acc.getUsername())) {
                if (rs.getString("password").equals(acc.getPassword())) {
                    result = new Info("successful");
                    break;
                } else {
                    result = new Info("invalid password");
                    break;
                }
            }
            else
                result = new Info("invalid username");
        }
        rs.close();
        c.close();
        return result;
    }


и на стороне клиента делаю restful:
public interface getUser{
        @GET("/getUser/{user}")
        Call<Info> CurrUser(@Path("user") String str);
    }

POJO класс:
public class Info {
    @SerializedName("information")
    @Expose
    private String information;

    public Info(String information) {
        this.information = information;
    }

    public String getInformation() {
        return information;
    }
}

Создаю апишку:
public class AutirizationAPI {
    private static String BASE_URL = "http://<myIP>:4567";
    public static EgeCalcApi.getUser getApi() {
        Gson gson = new GsonBuilder()
                .setLenient()
                .create();
        Retrofit retrofit = new Retrofit.Builder()
                .baseUrl(BASE_URL)
                .addConverterFactory(GsonConverterFactory.create(gson))
                .build();

        EgeCalcApi.getUser getuser = retrofit.create(EgeCalcApi.getUser.class);
        return getuser;

    }
}

Ну и, собственно, обращаюсь к по апи к сервису, чтобы получить инфу:
public class UserLoginTask extends AsyncTask<Void, Void, Boolean> {

        private final String mLogin;
        private final String mPassword;
        private String mError = "1";
        private int i = 1;
        private EgeCalcApi.getUser getUser;
        private Account acc;
        UserLoginTask(String login, String password) throws UnsupportedEncodingException, NoSuchAlgorithmException {
            mLogin = login;
            mPassword = getHash(password);
            acc = new Account(mLogin, mPassword, "",0);
        }

        @Override
        protected Boolean doInBackground(Void... params) {
            // TODO: attempt authentication against a network service.
                Gson gson = new Gson();
                String str = gson.toJson(acc);
                getUser = AutirizationAPI.getApi();
                getUser.CurrUser(str).enqueue(new Callback<Info>() {
                    @Override
                    public void onResponse(@NonNull Call<Info> call, @NonNull Response<Info> response) {
                        System.out.print(response.body());
                        Info info = response.body();
                        assert info != null;
                        mError = info.getInformation();
                        System.out.print(mError);
                        if (mError.equals("successful"))
                            i = 0;
                        else {
                            i = 1;
                        }
                    }

                    @Override
                    public void onFailure(@NonNull Call<Info> call, @NonNull Throwable t) {
                        Toast.makeText(LoginActivity.this, "Ошибка сети" + t, Toast.LENGTH_SHORT).show();
                    }
                });
                return i == 0;
        }

        @Override
        protected void onPostExecute(final Boolean success) {
            mAuthTask = null;
            showProgress(false);

            if (success) {
                Intent i = new Intent(LoginActivity.this, MainActivity.class);
                startActivity(i);
                finish();
            } else {
                if(mError.equals("invalid password")) {
                    mPasswordView.setError(mError);
                    mPasswordView.requestFocus();
                }
                else if(mError.equals("invalid username")){
                    mEmailView.setError(mError);
                    mEmailView.requestFocus();
                }
            }
        }

        @Override
        protected void onCancelled() {
            mAuthTask = null;
            showProgress(false);
        }
    }


Ситуация следующая, response не возвращает ничего почему-то, однако когда я тестирую серверную часть по ссылке [myIP]:4567/getUser/{"username":"TestUser","password":"TestPassword","email":"Test@gmail.com","phone":0}
он возвращает мне структуру {"information":"invalid password"}, ну то есть то что и должен отсылать сервер. И вот я в замешательстве, почему так, и как это лечится? 2 дня в интернетах искал, пока ничего не нашел. Буду очень благодарен за помощь.
  • Вопрос задан
  • 128 просмотров
Решения вопроса 1
prumin
@prumin Автор вопроса
Изучаю Java и мобильную разработку
Проблема в том, что я смешал синхронную и асинхронную логику.

@Override
protected Boolean doInBackground(Void... params) {
        // ...
        getUser.CurrUser(str).enqueue(new Callback<Info>() { // Строчка (*)
            // Весь код ниже будет выполнен асинхронно
            @Override
            public void onResponse(@NonNull Call<Info> call, @NonNull Response<Info> response) {
                // ...
                if (mError.equals("successful"))
                    i = 0;
                else {
                    // Никто не знает, 
                    // когда конкретно это произойдёт
                    i = 1;
                }
            }

            @Override
            public void onFailure(@NonNull Call<Info> call, @NonNull Throwable t) {
                // ...
            }

        // Весь код выше будет выполнен асинхронно
        });

        // Эта строчка выполнится сразу же
        // после строчки (*)
        return i == 0;
}


Способ решения — сделал запрос синхронно, (продолжил использовать AsyncTask), с использованием execute вместо enqueue
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы