我尝试使用以下路由定义将不同的子路径处理分成不同的类:
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个问题:
response.body("")
?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的答案。
答案 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