我是Yesod的新手,目前正在尝试开发一个前端网站和一个后端的宁静网络服务。要从网站访问API,我使用AJAX请求。对于请求的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中?
答案 0 :(得分:1)
我没有太多使用这个包,但是yesod-js-routes
似乎符合要求。基本上,包接收您的路由文件并生成可用于创建URL的Javascript函数。
该软件包暂时没有看到活跃的开发,但基于测试它仍然可以正常工作。它不是Hackage,而是一个文件,所以我只是将它复制到我的项目中(我还需要将import Prelude
添加到该文件中,并将mtl
添加到Cabal文件的build-depends部分)。该项目的自述文件涵盖了您需要执行的软件包的基本集成。
这是一些示例输出。对于此路线文件:
/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
返回
"/test/a/2/"
不幸的是,生成的Javascript和Javascript语言都没有采取任何措施来防范,例如将3个参数传递给该函数,或传递错误类型的参数。我不知道您的期望是什么,但Javascript代码生成看起来很简单,您可以改进生成的内容。