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 代码生成看起来很简单,您可以改进生成的内容。
我对 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 代码生成看起来很简单,您可以改进生成的内容。