Java Spark 请求的路由 [/users/] 尚未映射到 Spark for Accept : [*/*]

标签 java put

我有以下方法来修改 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”进行身份验证检查)。但是,这里有一个关于其工​​作原理的小示例:
  • 导航:"/users"-> 调用 get("",...) -> 重定向到:"/users/index.html"
  • 导航:"/users/"-> 调用 get("/*",...) -> 重定向到:"/users/index.html"
  • Nav: "/users/index.html"-> 调用 get("/index.html",...) -> 没有重定向。

  • 所以你可以看到如何使用这样的东西将允许你将流量发送到你期望的地方。但是,有一些事情要记住:
  • 当您有 URL 参数/ token 时,使用它可能会出现问题(如果不小心,可能会丢失它们)
  • 顺序很重要,因为如果“/*”在“/index.html”之前,那么“/users/index.html”将始终触发“/*”(并无限重定向)而不是触发“/index.html”的路由"
  • 在我的示例中,我使用的是 get,因此这种方法通常是预期的(保存#1),但是对于其他方法(例如放置/发布),像这样更改路径可能会导致意外结果,因此在使用时要小心使用这种方法,您不会将流量重定向到非预期的端点。
  • 如果 SEO 对您很重要,您可以考虑使用我在上面描述的这种方法作为 301 来提示那些正在抓取您的网站的人您的输出 URL 是永久重定向。这可能比只为所有端点放置相同的路由更可取(这也是一个有效的替代方案 [见下文])。

  • 我的故意比你的复杂一点,这是你如何处理你的:
    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/

    相关文章:

    java - 警告 : The following options were not recognized by any processor: '[room.schemaLocation]'

    java - HTTPURLConnection - 内容完整性

    angularjs - PUT 请求通过 URL 发送参数

    java - Post 方法在 Android 的 AsyncHttpClient 中不起作用

    java - 如何在两个节点之间交换数据? ( java )

    bash - 如何在 bash 中执行 HTTP PUT?

    java - httpclient放置问题

    python - 在 Python WSGI 中处理 HTTP PUT 方法

    java - GUI线程更新问题

    java - 为什么我的输出不符合预期? Java ACM