Yesod:在 AJAX 调用中使用类型安全的 URL

Yesod: Using typesafe URLs in AJAX calls

本文关键字:类型安全 URL AJAX 调用 Yesod      更新时间:2023-09-26

在我的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 URL 看起来像api/board/1/1而不是api/board?bid=1&tid=1,那么正确的解决方案是什么?继续使用手动定义的 URL "/api/hide/thread/"+board+"/"+threadId

经过一番搜索,我发现了这个讨论,建议您将 url 作为"data-url"属性添加到某个元素中。然后从元素加载 url。像这样:

<div id="thread-1" data-hide-url=@{ApiHideTHreadR}>
var url = $("#thread-1").data("hide-url")

我一直在做的是摆脱路由调用中传递的显式参数,而是将其替换为:

getApiHideThreadR::Handler JSON
getApiHideThreadR = do 
  rawTextParam <- lookupGetParam "text"
  rawThreadId  <- lookupGetParam "table"
  (textParam,threadParam) <- someParseFunction rawTextParam rawThreadId
  ... 

然后你可以使用常规的 ajax 样式:

$.getJSON("@{ApiHideThreadR}",{text:"sometext",tabe:"sometable"},success()...

对于更复杂的 get to haskell 类型请求:https://github.com/yesodweb/yesod/wiki/Convert-get-params-into-a-haskell-record

是一个很好的模板。

不能使用类型安全的路由在编译时检查仅在运行时知道的内容。我怀疑你也知道这一点,但这是我能对你的问题做出的唯一理解。因此,您唯一的选择是手动执行此操作。