我有以下方法来修改 Postgres 数据库中的用户:
public void modifyUser(User usr){
try (Connection conn = sql2o.beginTransaction()){
conn.createQuery("update public.\"user\" set name=:name, lastname=:lastname, email=:email where id=:id")
.addParameter("id", usr.getId())
.addParameter("name", usr.getName())
.addParameter("lastname", usr.getLastname())
.addParameter("email", usr.getEmail())
.executeUpdate();
conn.commit();
}
}
由这个方法调用:
//update
put("/users", (request, response) -> {
response.type("application/json");
User user = new Gson().fromJson(request.body(), User.class);
model.modifyUser(user);
return new Gson().toJson(response);
});
我使用 postman 来指定正文,这样:
{ "id": 3,
"name": "Mary",
"lastname": "Changed",
"email": "email"
}
但是,即使 post 方法工作正常,这个“放置”操作也会引发以下错误:
spark.http.matching.MatcherFilter - The requested route [/users/] has not been mapped in Spark for Accept: [*/*]
我不明白错误是什么。我找不到任何解决方案。
最佳答案
我知道这是一个旧线程,但我希望提供有关该主题的一些额外信息。
路径的 "/users"和 "/users/"是 2 条不同的路径,因此可以选择允许 2 条不同的 spark 路径(在我看来,spark 实际上确实做得很好)。
下面是一个例子,当我不想要 2 个不同的路由时,我通常如何在我的 Spark 服务器中解决这个 [双关语,不抱歉]:
path("/user", () ->
{
get("", GenericRoutes.redirectToSlashIndex);
get("/index.html", GenericRoutes.pathGet_index);
get("/*", GenericRoutes.redirectToIndex);
});
这里的想法是第一个 ("") 发送到第二个 ("/index.html"),第三个 ("/*") 将任何不存在的路径发送到第二个 ("/index.html") 作为好。
然后在 Generic Routes 类中,你会有类似的东西:
public static final Route redirectToIndex = new Route()
{
@Override
public Object handle(Request request, Response response) throws Exception
{
String path = request.pathInfo();
path = path.substring(0, path.lastIndexOf('/')+1)+"index.html";
response.redirect(path, 301);
return "<html>Redirecting...</html>";
}
};
public static final Route redirectToSlashIndex = new Route()
{
@Override
public Object handle(Request request, Response response) throws Exception
{
response.redirect(request.pathInfo() + "/index.html", 301);
return "<html>Redirecting...</html>";
}
};
我已经简化了我通常在这里做的一些事情(您可能希望在这些路由中进行更多错误处理,并通过这些路由之外的“before”进行身份验证检查)。但是,这里有一个关于其工作原理的小示例:
所以你可以看到如何使用这样的东西将允许你将流量发送到你期望的地方。但是,有一些事情要记住:
我的故意比你的复杂一点,这是你如何处理你的:
path("/user", () ->
{
/*Looks like you mentioned you had a post with the 'first version', so I think like this?*/
post("", UserRoutes.postUsers); //post: /users
put("", UserRoutes.putUsers); //put: /users
put("/*", UserRoutes.putUsers); //put: /users/
});
请注意,在上面的最后一个放置示例中,您可以使用“/*”或仅使用“/”。使用 * 您将捕获以“/users/”开头的任何路径,而没有 * 您只允许“/users/”通过。因此,使用 * 您可以执行“/users/e13a319e-16d9-3ff5-a83c-96564007998e”,它会触发端点,但如果没有 *,相同的路径将失败,这与上面的 #1 直接相关。
因此,您采用哪种方法实际上取决于您站点的意图以及您做什么或不希望那些访问您的端点的人做什么和看什么。快乐编码!
关于Java Spark 请求的路由 [/users/] 尚未映射到 Spark for Accept : [*/*],我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55143301/