2017-01-18 6 views
0

タイトルはそれを要約します。私はスナップですべての私の応答にヘッダーを追加したい。私は100本の異なるルートを持っていると私はそれらすべてにヘッダを追加したい場合は今スナップフレームワークのすべてのレスポンスにヘッダーを追加します

apiRoutes :: [(ByteString, Handler b Api())] 
apiRoutes = [("status", addHeader)] 


addHeader :: Handler b Api() 
addHeader = do 
    modifyResponse (setHeader "Content-Type" "application/json") 
    otherHandler 

otherHandler :: Handler b Api() 
otherHandler = metod Get doActualStuff <|> metod Get doMoreActualStuff 

: は、私のような私のルートのそれぞれについて、modifyRequestハンドラを追加することができます。私はすべてのルートのためのインターセプター関数を書く必要があります。ヘッダーを変更したい場合は、100個のすべてのインターセプター関数を変更する必要があります。

簡単な方法はありますか?

+0

これは私にとってかなり短くて簡単です。このアプローチの問題点は何ですか? – jkeuhlen

+0

@jkeuhlenは、私は100の異なるルートを持っていて、それらにすべてヘッダーを追加したいとします。私はすべてのルートのためのインターセプター関数を書く必要があります。ヘッダーを変更したい場合は、100個の関数すべてを変更する必要があります。 –

+1

私はスナップに慣れていませんが、 'apiRoutes = map(second(modifyResponse ... *)))[(" status "、otherHandler)]'を定義することはできません。 – sjakobi

答えて

1

sjakobiが提供したヒントで私はそれを理解しました。これは次のようにすることができます:

apiRoutes :: [(ByteString, Handler b Api())] 
apiRoutes = map (mapSecond (addHeaders >>)) 
[("status", addHeader)] 


addHeaders :: Handler b Api() 
addHeaders = do 
    modifyResponse (setHeader "Content-Type" "application/json") 
    modifyResponse (setHeader "more-header" "more-header") 

mapSecond :: (b -> c) -> (a,b) -> (a,c) 
mapSecond f (a,b) = (a,f b) 
関連する問題