Техническое понимание запросов на флаттер http, серверного PrintWriter и клиентского кода 200 - PullRequest
0 голосов
/ 19 сентября 2019

Мое приложение для флаттера отправляет запрос http в мой бэкэнд google-app-engine.В этом запросе голос пользователя по простому вопросу или «вопрос» отправляется и затем сохраняется в базе данных mysql.Когда это будет сделано, пользователь увидит другой вопрос и снова проголосует.Итак, вопрос, голосование, вопрос, голосование, вопрос, голосование и тд.

Теперь пользователь не должен видеть один и тот же вопрос дважды.Поэтому у моего запроса mysql, который получает другой вопрос, есть условие: «загрузите вопрос, за который пользователь еще не проголосовал».Это прекрасно работает в 99% случаев.Но в редких случаях бывает, что пользователь снова и снова видит один и тот же вопрос подряд примерно 4 или 5 раз, что говорит мне о том, что мое приложение может загрузить «следующий» вопрос (который, в данном случае, снова тот же вопрос)) до голосования был сохранен в моей базе данных.

Чтобы отладить это, я пытаюсь понять технические вещи, происходящие в фоновом режиме.В частности, мне нужно знать, когда код 200 статуса срабатывает после того, как мое приложение отправило голосование пользователей в запросе.Это моя серверная часть, когда отправляется голосование:

иначе if (operation.equals ("voiceFav")) {

        out.println("vote received");


        // get userID and favID
        Integer userID = Integer.valueOf(request.getParameter("userID"));
        String creatorID = request.getParameter("creatorID");
        Integer favID = Integer.valueOf(request.getParameter("favID"));
        String voter = request.getParameter("voterName");
        String winpic = request.getParameter("winpic");

        try{

            Connection conn = DriverManager.getConnection(mysqlUrl);
            PreparedStatement ps;
            ResultSet rs;
            String query;

            // prepare Statement
            if(winpic.equals("1")) query = "INSERT INTO faved (favID, userID, voting) VALUES (?,?,1)";
            else if(winpic.equals("2")) query = "INSERT INTO faved (favID, userID, voting) VALUES (?,?,2)";
            else query = "INSERT INTO faved (favID, userID, voting) VALUES (?,?,-1)";
            ps = conn.prepareStatement(query);          

            ps.setInt(1, favID);
            ps.setInt(2, userID);

            // send vote to database
            ps.execute();               
            ps.close();



            // close connection     
            out.flush();
            conn.close();

        } catch (Exception e) {
            out.print("Fehler voting: " + e);
            out.flush();
        }


    }

Мой вопрос: Когда срабатывает clientCode 200 codeCode 200?Срабатывает ли он сразу, когда я использую PrintWriter, чтобы записать «полученный голос» в первой строке?Или он срабатывает только когда я закрываю соединение?

Надеюсь, все станет ясно:)

Ответы [ 2 ]

0 голосов
/ 22 сентября 2019

Хорошо, проблема решена.Это была одна странная строка кода, я понятия не имею, как она попала в мой код.Запрос, запрашивающий новый вопрос, не только говорит «пожалуйста, верните новый вопрос, на который пользователь с ID = 123 еще не ответил», он также имеет дополнительный фильтр, например «только вопросы, соответствующие темам еда, мода или спорт».

Теперь этот фильтр динамически создается в цикле for в моем prepareStatement:

// fill dynamically generated statement
                ps.setInt(1, userID);
                ps.setInt(2, userID);
                ps.setInt(3, userID);
                for (int i = 0; i < categoryIDs.length; i++){
                    ps.setInt(i+4, Integer.valueOf(categoryIDs[i]));
                    //ps.setInt(i+3, Integer.valueOf(categoryIDs[i])); this line is completely BS
                }

Позиция 3 в моем выражении заполнена идентификатором пользователя, который заботится о состоянии ", на которое пользователь123 еще не ответил».Теперь посмотрите закомментированную строку внутри цикла for?Эта строка заменила мое условие «на которого пользователь123 еще не ответил» на «на которое пользователь1 еще не ответил» в случае выбора темы 1.Итак, мой запрос был полностью испорчен.

Итак, в любом случае, проблема решена:)

0 голосов
/ 19 сентября 2019

Обычно код 200 statusCode отправляется с бэкэнда в момент выполнения команды ps.В тот момент, когда вы пишете в базе данных.

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

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