【问题标题】:technical understanding of flutter http request, serverside PrintWriter and clientside 200 codeFlutter http请求、服务端PrintWriter和客户端200代码的技术理解
【发布时间】:2019-09-19 08:40:45
【问题描述】:

我的 Flutter 应用向我的 google-app-engine 后端发送了一个 http 请求。在此请求中,发送用户对简单的非此即彼问题的投票,然后将其存储在 mysql 数据库中。完成后,用户会看到另一个问题并再次投票。所以,问题,投票,问题,投票,问题,投票等等。

现在,用户不应该两次看到相同的问题。因此,我得到另一个问题的 mysql 查询有一个条件说“下载用户尚未投票的问题”。这在 99% 的情况下都非常有效。但在极少数情况下,用户会一次又一次地连续看到相同的问题 4 或 5 次,这告诉我我的应用程序可能会下载“下一个”问题(在这种情况下又是同一个问题) ) 在投票存储在我的数据库中之前。

为了调试它,我试图了解后台发生的技术问题。具体来说,我需要知道在我的应用程序向用户发送请求投票后何时触发 200 状态码。这是发送投票时我的服务器端部分:

else if (operation.equals("voteFav")){

        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();
        }


    }

我的问题是:客户端 statusCode 200 何时触发?当我使用 PrintWriter 在第一行写回“收到的投票”时,它会立即触发吗?还是只有在我关闭连接时才会触发?

希望清楚:)

【问题讨论】:

    标签: java google-app-engine flutter


    【解决方案1】:

    通常,200 statusCode 是在您执行 ps 的那一刻从后端发送的。在您写入数据库的那一刻。

    由于这个问题只是偶尔发生,我对您的问题的看法是,您在将数据插入数据库时​​可能会遇到某种滞后。

    【讨论】:

    • 谢谢你,安德烈,感谢你的帮助。您说“通常”,请问您有多确定?我试图在服务器发回 200 时用谷歌搜索,但我只发现“请求成功时发生 200”之类的一般信息,但这并不能告诉我我的 out.println("...") 是否已经导致200 或者如果我的服务器等待 - 正如你所说 - 直到 ps 被执行。确实,它一定与任何类型的滞后有关。我可能必须找到一种方法,让服务器仅在插入成功时才发回特定字符串,然后在客户端等待该特定字符串。
    • 你可以从你的代码中做到这一点。插入后,您可以进行另一个查询以查看是否插入(如果数据在数据库中并且可用),如果是,则显示一条消息。
    【解决方案2】:

    好的,问题解决了。这是一行奇怪的代码,我不知道它是如何进入我的代码的。询问新问题的查询不仅说“请返回 ID = 123 的用户尚未回答的新问题”,它还有一个额外的过滤器,例如“仅匹配主题食品、时尚或运动的问题”。

    现在,这个过滤器是在我的preparedStatement中的for循环中动态构建的:

    // 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 填充了处理条件“user123 尚未回答”的用户 ID。现在,看到 for 循环中的注释行了吗?如果选择了主题 1,这一行将我的条件“哪个 user123 还没有回答”替换为“哪个 user1 还没有回答”。所以,我的查询完全搞砸了。

    所以,无论如何,问题解决了:)

    【讨论】:

      猜你喜欢
      • 2014-08-06
      • 2017-05-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-08-14
      • 1970-01-01
      • 1970-01-01
      • 2013-03-07
      相关资源
      最近更新 更多