Haskell 仆人中的安全链接

Haskell 仆人中的安全链接,haskell,servant,Haskell,Servant,Servant使用Servant.API.safeLink生成相对URL,但我遇到了一个问题,这让我觉得我对如何使用它或如何定义Servant API的一些基本问题有误解 我构造的最小示例包含两个端点。一个是位于(相对URL)/foo的“前门”端点,另一个是位于/foo/1: {-# LANGUAGE DataKinds #-} {-# LANGUAGE TypeOperators #-} import Servant data HTML type Foo = "foo" :>

Servant使用
Servant.API.safeLink
生成相对URL,但我遇到了一个问题,这让我觉得我对如何使用它或如何定义Servant API的一些基本问题有误解

我构造的最小示例包含两个端点。一个是位于(相对URL)
/foo
的“前门”端点,另一个是位于
/foo/1

{-# LANGUAGE DataKinds     #-}
{-# LANGUAGE TypeOperators #-}
import Servant

data HTML
type Foo = "foo" :> (Foo0 :<|> Foo1)
type Foo0 = Get '[HTML] String
type Foo1 = "1" :> Get '[HTML] String

slFoo :: Link
slFoo = safeLink (Proxy :: Proxy Foo) (Proxy :: Proxy Foo1)
{-#语言数据类型}
{-#语言类型运算符{-}
进口佣人
数据HTML
键入Foo=“Foo”:>(Foo0:Foo1)
键入Foo0=Get'[HTML]字符串
键入Foo1=“1”:>获取'[HTML]字符串
slFoo::Link
slFoo=safeLink(Proxy::Proxy Foo)(Proxy::Proxy Foo1)
上面的
slFoo
的定义给出了错误

无法推断:IsElem'(“1”:>获取'[HTML]字符串)(“foo”:>(Foo0:Foo1))

…这正是我在要求safeLink生成不在其第一个参数定义的API中的链接时遇到的错误类型。当
safeLink
的第二个参数改为
Proxy::Foo0
时,错误类似


我已经尝试了很多,很多的排列方式,但似乎无法通过使用我找到的文档来解决这个问题。我希望有一些指针能让我找出我的误解所在。

该示例不起作用,因为您为端点定义的类型
Foo1
,它本身并不包含相对于
Foo
API顶部的自身完整路径

解决这种情况的一种方法是使用“扁平化”API:

safeLink(Proxy::Proxy(flatfoo))(Proxy::Proxy(Nth 1(flatfoo)))

(还需要
导入Servant.API.flant

缺点是您必须知道
Foo1
Foo
中的顺序位置。似乎没有办法通过使用问题中指定的类型来获得您想要的答案。您可以首先定义扁平化API,代价是使结构清晰(IMO)


感谢您在上述问题的评论中向我解释这一点。他的回答真应该得到表扬

这是因为
Foo1
不包含前面的
foo
静态路径片段,所以当您要求服务人员为
Foo1
生成链接(在
foo
API中)时,它找不到与
Foo1
完全匹配的端点并发出抱怨。也许类似的内容适合这里?就像那些文档中的客户机/服务器示例一样,您可以将
Foo
API类型的“扁平化”版本作为
safeLink
的第二个参数传递,第一个参数可能会在所述扁平化API类型上使用
Nth
,以达到您想要的端点?关于服务扁平化的使用,令人惊讶的是,我并不是唯一的用户:-)看。关于你的实际问题,我们的想法是,不要将
apiProxy::Proxy YourAPI
传递给你正在使用的任何函数(
service
client
safeLink
,…),而是传递类型为
Proxy(Flat YourAPI)
。您不必定义
Nth
的实例,只需使用它来获取到正确端点的代理即可
Nth
将为
+1
th端点提供API类型<代码>第n个0第一个,第二个
第n个1
第二个,等等。如果这不够清楚,请给我发电子邮件,我不太喜欢这些事情。事实上,
第n个
似乎没有在公共存储库中使用。我很高兴合并一个补丁,它为它的haddock添加了一个使用
Nth
的示例Re:github search,当我寻找使用某个库/函数的示例时,我总是先看看那里,我绝对推荐它。