java - 处理来自一个 POST 请求的 3 个不同响应

标签 java postgresql rest post

我正在尝试更改以下代码,以便它只进行一次查询而不是两次查询。问题是,您可以看到我需要返回 3 个可能的响应。如果没有满足条件,则默认为底部的 404,如果登录凭据正确但帐户已过期,则返回第二个 404 响应。如果帐户正确且有效,则返回唯一有效的响应 (200)。

如何将 SELECT 语句合并为一个,同时保留根据用户状态以 3 种不同方式响应的能力?

    @POST
    @Path("accounts/initial/{user}")
    @Produces("application/json")
    @Consumes("application/json")
    public Response validate(@PathParam("user") final String username) {

        PreparedStatement statement = null;
        ResultSet rs = null;
        Connection conn = null;
        try {
            conn = LicenseDBSource.getInstance().getConnection();
            statement = conn.prepareStatement("SELECT * FROM members WHERE username = ?");
            statement.setString(1, username);
            rs = statement.executeQuery();

            if (rs.next()) {
                statement = conn.prepareStatement("SELECT * FROM members WHERE
                username = ? AND LOCALTIMESTAMP < expiration");
                statement.setString(1, username);

                rs = statement.executeQuery();
                if (rs.next()) {
                    return Response.status(200).build();
                    }
                } else {
                    return Response.status(404).entity("Expired").build();
                }
            }
        } catch (...) {
           ...handle exceptions...
        } finally {
            closeResources(...);
        }
        return Response.status(404).entity("Incorrect").build();
    }

我的数据库包含包含“用户名”和“过期时间”的列。

最佳答案

如果你想用一个语句执行两个查询,你可以只使用两个子查询。你的 try block 看起来像:

try {
    conn = LicenseDBSource.getInstance().getConnection();
    statement = conn.prepareStatement(
        "SELECT " + 
        "   EXISTS (SELECT * FROM members WHERE username = ?) AS user_exists, " +
        "   EXISTS (SELECT * FROM members WHERE username = ? " + 
                       " AND LOCALTIMESTAMP < expiration) AS user_is_current" ;
    statement.setString(1, username);
    statement.setString(2, username);
    rs = statement.executeQuery();
    rs.next(); // There will *always* be one row
    if (rs.getBoolean("user_exists")) {
        if (rs.getBoolean("user_is_current") {
            return Response.status(200).build();
        } else {
            return Response.status(404).entity("Expired").build();
        }
    }

备选方案,使用单个查询,但这次您有两个选择:它要么不返回任何行(意味着用户不存在),要么只返回一个行(假设 usrname 是 PK),计算列告诉您用户是否是当前用户。这实际上比以前的方法更干净并且花费的时间更少:

try {
    conn = LicenseDBSource.getInstance().getConnection();
    statement = conn.prepareStatement(
        "SELECT " + 
        "    (LOCALTIMESTAMP < expiration) AS user_is_current " +
        "FROM " +
        "    members WHERE username = ?";

    statement.setString(1, username);
    rs = statement.executeQuery();

    if (rs.next()) {
        if (rs.getBoolean("user_is_current") {
            return Response.status(200).build();
        } else {
            return Response.status(404).entity("Expired").build();
        }
    }
}

关于java - 处理来自一个 POST 请求的 3 个不同响应,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44874763/

相关文章:

sql - 我可以使用 Postgres 函数在固定大小的旋转矩形内查找点吗?

php - 在 PHP 中获取请求的 "Content-Type" header

postgresql - 在 Mac 上安装 PostGIS for PostgreSQL 时出错

java - 如何确定表达式在堆栈中是否具有平衡括号?

java - Android:在 3 个 Activity 之间传递相同的变量?

java - Spring Boot JPA不会使用save方法更新记录

java - PostgreSQL:遇到无效的字节序标志值

json - 如何将两个不同的对象传递给 postman 中的 POST 请求以测试 RESTful API?

java - 在 RESTful 服务 Java 中实现模板方法设计模式

java - Java/Scala 中的 CAS 和 SAML 2.0 实现