在Spark Java中将路由处理卸载到不同类的预期/更好的方法是什么?

时间:2017-03-20 12:55:41

标签: spark-java

我尝试使用以下路由定义将不同的子路径处理分成不同的类:

public static void main(String[] args) {

    port(Integer.valueOf(System.getenv("PORT")));
    staticFileLocation("/public");

    get("/test", (req, res) -> "OK");
    path("/api", () -> {
        path("/x", () -> {
            post("/action1",      (request, response) -> XAPIHandler.action1(request, response));
        });
        path("/y", () -> {
            post("/action1",       (request, response) -> YAPIHandler.action1(request, response));
            post("/action2",       (request, response) -> YAPIHandler.action2(request, response));
            post("/action3",       (request, response) -> YAPIHandler.action3(request, response));
            get("/action4",        (request, response) -> YAPIHandler.action4(request, response));
        });
    });
}

然后我有以下API处理程序类结构:

public class YAPIHandler {

    public static Object action1(Request request, Response response) {
        try {
            //Some logic goes here
            response.header("Content-Type", "application/json");
            response.status(200);
            response.body(myJsonObject.serialize()); //a bit of pseudocode here, in reality using Gson library
        } catch (Exception e) {
            response.status(500);
            response.body("Some error message");
        }
        return response.body();
    }
    ...
}

这种特殊方法对我来说似乎没问题并且运行良好,直到在一个特定场景(actionZ)中,无论通过response.status(...)设置了什么状态,它都开始返回404。经过一些测试后,我意识到这是因为actionZ在成功的情况下除了200状态之外没有向用户返回任何内容,因此从未明确设置响应体。调用response.body("")已经修复了404问题,但让我意识到我不了解Spark Java框架是如何工作的,并让我怀疑是否有单独的API处理程序类是开始的正确方法。 / p>

2个问题:

  1. 使用上面的代码结构是否可以使用空体返回200 ok响应,而无需显式调用response.body("")
  2. 是否有另一种方法可以将处理程序逻辑拆分为更独立的类,这些类更符合Spark"做事方式"?
  3. P.S。我看到路线上的Spark文档似乎在以下示例中提出了某种处理程序分解:

    path("/api", () -> {
        before((q, a) -> log.info("Received api call"));
        path("/email", () -> {
            post("/add",       EmailApi.addEmail);
            put("/change",     EmailApi.changeEmail);
            delete("/remove",  EmailApi.deleteEmail);
        });
        path("/username", () -> {
            post("/add",       UserApi.addUsername);
            put("/change",     UserApi.changeUsername);
            delete("/remove",  UserApi.deleteUsername);
        });
    });
    

    但我无法复制它。因此,如果有人可以通过方法签名和返回值从上面的示例中为EmailApi类提供示例结构,那么这可能是我正在寻找的Q2的答案。

1 个答案:

答案 0 :(得分:2)

之后不使用body()将状态设置为200:

Spark.get("/", (req, res) -> {
    res.status(200);
    return "";
});

可以通过java8方法引用将工作委托给某些处理程序。 想象一下,你在class LoginHandler

中有这样的方法
public static String login(Request req, Response res) {
    // do stuff
}

然后在你的主要课程中你可以打电话:

Spark.get("/login", LoginHandler::login);

关于json或其他格式的序列化,我建议你看一下

响应变压器

文档部分:http://sparkjava.com/documentation.html#response-transformer