2017-01-18 8 views
0

제목에서이를 요약합니다. 내 모든 응답에 헤더를 스냅에 추가하고 싶습니다. 내가 좋아하는 내 경로의 각각에 대해 modifyRequest 처리기를 추가 할 수 있습니다 : 나는 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 

. 나는 모든 경로에 대한 인터셉터 함수를 작성해야한다. 헤더를 변경하려면 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)