Yesod:julius 模板中的参数处理程序

Yesod: parametric handler in julius templates

我对 Yesod 很陌生,目前正在尝试开发前端网站和后端 restful 网络服务。要从我使用 AJAX 请求的网站访问 API。对于请求的 URL,我想使用像调用这样的莎士比亚模板:

$.ajax({
  url: '@{PersonR}',
  type: 'GET',
  contentType: "application/json",
  data: JSON.stringify({...}),
  success: function (data) {...}
});

在后端站点上,我的 PersonR 处理程序的路由定义如下:

/api/person/#Int/get PersonR GET

为此,处理程序具有类似

的签名
getPersonR :: Int -> Handler Value

但是现在 julius 模板需要一个参数才能有效。我做了一些实验,发现我也可以在@{...} 中直接使用 haskell 代码。也许我错过了 doku 中的那一点。 问题 1:有没有办法判断其中一个参数可以在 JavaScript 中给出?也许用渲染器输出这样的东西:

function(var1){return '/api/person/'+var1+'/get';}

我认为这缺乏类型安全性。这就引出了我的第二个问题(这有点否定了第一个):是否有任何其他方法可以实现将数据获取到客户端的 URL 中?

我没怎么用过这个包,但 yesod-js-routes 看起来很合适。基本上,该包获取您的路由文件并生成 Javascript 可用于创建 URL 的函数。

该软件包有一段时间没有看到积极的开发,但根据测试它仍然可以正常工作。它不在 Hackage 上,但它是一个文件,所以我只是将它复制到我的项目中(我还需要将 import Prelude 添加到该文件,并将 mtl 添加到 Cabal 文件的构建依赖部分).该项目的 README 涵盖了您需要做的包的基本集成。

这是一些示例输出。对于此路由文件:

/static StaticR Static appStatic
/auth   AuthR   Auth   getAuth

/favicon.ico FaviconR GET
/robots.txt RobotsR GET

/ HomeR GET POST

/comments CommentR POST
/jsRoutes JSRoutesR GET
/test/#Text/#Integer TestR GET POST

我知道了 Javascript:

;
var jsRoutes = {}; /* Subsite not supported */ ; /* Subsite not supported */ ;
jsRoutes.FaviconR = {
    get: function() {
        return {
            method: "get",
            url: "/favicon.ico/"
        };
    }
};
jsRoutes.RobotsR = {
    get: function() {
        return {
            method: "get",
            url: "/robots.txt/"
        };
    }
};
jsRoutes.HomeR = {
    get: function() {
        return {
            method: "get",
            url: "/"
        };
    },
    post: function() {
        return {
            method: "post",
            url: "/"
        };
    }
};
jsRoutes.CommentR = {
    post: function() {
        return {
            method: "post",
            url: "/comments/"
        };
    }
};
jsRoutes.JSRoutesR = {
    get: function() {
        return {
            method: "get",
            url: "/jsRoutes/"
        };
    }
};
jsRoutes.TestR = {
    get: function() {
        return {
            method: "get",
            url: "/test/" + arguments[0] + "/" + arguments[1] + "/"
        };
    },
    post: function() {
        return {
            method: "post",
            url: "/test/" + arguments[0] + "/" + arguments[1] + "/"
        };
    }
};

对于像TestR这样的路线,您可以拨打:

jsRoutes.TestR.get("a",2).url

到return

"/test/a/2/"

不幸的是,生成的 Javascript 和 Javascript 语言都没有做任何事情来防止例如向该函数传递 3 个参数,或传递错误类型的参数。我不知道您的期望是什么,但是 Javascript 代码生成看起来很简单,您可以改进生成的内容。