假設我們有這個簡單的 API:
type FooAPI
= "foo"
:> QueryParam "age" Int
:> Get '[PlainText] Text
有沒有辦法將 type-levelservant的 API 與將為它生成 URL 的函式鏈接?喜歡
someMagicFunction :: Proxy api -> SomeTypeFamily api
someMagicFunction = ?
generateURL :: Maybe Int -> Text
generateURL = someMagicFunction (Proxy @FooAPI)
>>> generateURL (Just 42)
"https://somehost/foo?age=42"
>>> generateURL Nothing
"https://somehost/foo"
我想增加URL生成的型別安全性,因此,如果我將添加一些新的引數,FooAPI它會立即出現在的型別generateURL,沒有編輯的電話我的代碼將無法編譯generateURL。
我知道servant-clientlibrary 并且我知道這個client函式有點相似,但我無法弄清楚如何在我的情況下使用這個庫。
uj5u.com熱心網友回復:
我會說這Servant.Links正是你要找的。
特別是,在您的情況下,我將用于allLinks生成Link對應于包含路徑和查詢引數的 URL 片段:
>>> linkURI $ allLinks (Proxy @FooAPI) Nothing
foo
>>> linkURI $ allLinks (Proxy @FooAPI) (Just 18)
foo?age=18
然后我將生成的Link轉換為URI我將指定所需方案和主機名的地方。這是一個完整的作業模塊:
{-# LANGUAGE DataKinds #-}
{-# LANGUAGE TypeApplications #-}
{-# LANGUAGE TypeOperators #-}
import Data.Proxy
import Data.Text (Text)
import Network.URI
import Servant.API
import Servant.Links
type FooAPI
= "foo"
:> QueryParam "age" Int
:> Get '[PlainText] Text
generateURL :: Maybe Int -> String
generateURL age = show uri
{ uriScheme = "https:"
, uriAuthority = Just nullURIAuth
{ uriRegName = "somehost" }
, uriPath = "/" <> uriPath uri
}
where
uri = linkURI link
link = allLinks (Proxy @FooAPI) age
并示范:
>>> generateURL (Just 42)
"https://somehost/foo?age=42"
>>> generateURL Nothing
"https://somehost/foo"
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/392570.html
下一篇:圖搜索演算法失敗
