在我的Yesod项目中,我有以下路线:
/api/hide/thread/#Text/#Int ApiHideThreadR GET
我想在客户端使用javascript:
请求它function hideThreadCompletely(threadId, board) {
$.getJSON("/api/hide/thread/"+board+"/"+threadId, function(data) {
$('#thread-'+threadId).hide();
});
}
但是我不能使用@{ApiHideTHreadR}
,因为Yesod需要它在编译时的参数。如果我希望API URLS看起来像api/board/1/1
而不是api/board?bid=1&tid=1
,那么适当的解决方案是什么?继续使用手动定义的网址,例如"/api/hide/thread/"+board+"/"+threadId
?
答案 0 :(得分:2)
经过一些搜索后,我发现了discussion,建议您将网址添加为某个元素的“data-url”属性。然后从元素加载url。 像这样:
<div id="thread-1" data-hide-url=@{ApiHideTHreadR}>
var url = $("#thread-1").data("hide-url")
答案 1 :(得分:1)
我一直在做的是摆脱路由调用中传递的显式参数,而是将其替换为:
getApiHideThreadR::Handler JSON
getApiHideThreadR = do
rawTextParam <- lookupGetParam "text"
rawThreadId <- lookupGetParam "table"
(textParam,threadParam) <- someParseFunction rawTextParam rawThreadId
...
然后你可以使用常规的ajax风格:
$.getJSON("@{ApiHideThreadR}",{text:"sometext",tabe:"sometable"},success()...
更复杂的获取haskell类型请求: https://github.com/yesodweb/yesod/wiki/Convert-get-params-into-a-haskell-record
是一个不错的模板。
答案 2 :(得分:1)
您无法使用类型安全路由来检查编译时仅在运行时中已知的内容。我怀疑你也知道这一点,但这是我能提出的唯一问题。因此,您唯一的选择是手动完成。