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

时间:2013-09-27 09:12:30

标签: javascript ajax haskell yesod

在我的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

3 个答案:

答案 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)

您无法使用类型安全路由来检查编译时仅在运行时中已知的内容。我怀疑你也知道这一点,但这是我能提出的唯一问题。因此,您唯一的选择是手动完成。