我做了一個自定義的組合子:MultipartUpload
,但是當我使用它,它最終將不僅是我使用它的路線,但所有後續路線:僕人組合子不通過下降到後續替代
對於例如,在以下API中,MultipartUpload
在第2條和第3條路徑上運行。所以如果我打電話給第三個,它將返回錯誤File upload required
。我只希望它適用於第二。怎麼樣?
type ModelAPI =
"models" :>
( ProjectKey :> Get '[JSON] [Model]
:<|> ProjectKey :> MultipartUpload :> Post '[JSON] Model
:<|> ProjectKey :> Capture "modelId" ID :> Get '[JSON] Model
)
以下是MultipartUpload
的定義方式。
{-# LANGUAGE DataKinds #-}
{-# LANGUAGE TypeFamilies #-}
{-# LANGUAGE TypeOperators #-}
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE TypeSynonymInstances #-}
module Servant.Multipart
(MultipartUpload
, FileInfo(..)
) where
import Data.ByteString.Lazy (ByteString)
import qualified Data.ByteString.Lazy as Lazy
import Network.HTTP.Types (status400)
import Network.Wai.Parse
import Network.Wai (responseLBS)
import Servant
import Servant.Server.Internal
data MultipartUpload
instance (HasServer sublayout) => HasServer (MultipartUpload :> sublayout) where
type ServerT (MultipartUpload :> sublayout) m =
FileInfo ByteString -> ServerT sublayout m
route Proxy subserver req respond = do
dat <- parseRequestBody lbsBackEnd req
let files = snd dat
case files of
[(_, f)] ->
if Lazy.null $ fileContent f
then respond . succeedWith $ responseLBS status400 [] "Empty file"
else route (Proxy :: Proxy sublayout) (subserver f) req respond
[] ->
respond . succeedWith $ responseLBS status400 [] "File upload required"
_ ->
respond . succeedWith $ responseLBS status400 [] "At most one file allowed"
請注意,這是非常類似於下面的組合子。我仔細看過其他組合器,我想我正確地定義它。我做錯了什麼? https://github.com/haskell-servant/servant/issues/133#issuecomment-125235662 –