2017-01-08 10 views
1

내 처리기에 해당하는 현재 경로를 얻고 싶습니다.Haskell Servant 현재 경로/URL 가져 오기 처리기에서

type ServerAPI = 
     "route01" :> Get '[HTML] Text 
    :<|> "route02" :> "subroute" :> Get '[HTML] Text 
    :<|> "route03" :> Get '[HTML] Text 

그리고 여기에 몇 가지 핸들러됩니다 :

route1and2Handler :: Handler Text 
route1and2Handler = do 
    route <- getCurrentRoute 
    addVisitCountForRouteToDatabaseOrSomethingOfThatSort... 
    return template 

route3Handler :: Handler Text 
route3Handler = return "Hello, I'm route 03" 

그리고 내 서버 :

server :: Server ServerAPI 
server = route1and2Handler :<|> route1and2Handler :<|> route3Handler 

그래서, 기본적으로 내 route1and2Handler 몇 가지 방법이 있어야 여기에 단지 참조를 위해 내 서버의 모형입니다 현재 경로를 얻는 중. 내 핸들러에 요청 객체를 얻고 HasServer 예과 같이 구현하여 그에서 URL을 추출 시도했다 :

data FullRequest 

instance HasServer a => HasServer (FullRequest :> a) where 
    type Server (FullRequest :> a) = Request -> Server a 
    route Proxy subserver request respond = 
     route (Proxy :: Proxy a) (subserver request) request respond 

[편집] 난 그냥 옛날에 대한 API를보고있는 것을 발견했다 서번트의 버젼이며, 이제는 유효하지 않습니다. 새 routeroute :: Proxy api -> Context context -> Delayed env (Server api) -> Router env의 유형 서명이 있으며 실제로 여기에서 Request을 얻는 방법을 모르겠습니다. 내 말을

`Server' is not a (visible) associated type of class `HasServer' 

그리고 단지 결국 지적 : HasServer 인스턴스를 만들려고 할 때


그리고 route1and2Handler 유형 서명을 만드는 것보다

Request -> Handler Text 할 수 있지만,이 오류를 받고 있어요 목표는 Handler에서 현재 경로를 얻는 것입니다. 데이터베이스의 경로에 대한 방문수를 추가하는 것은 예제 목적에 불과합니다. 나는 방문이나 그 종류의 것을 계산하는 더 좋은 방법에 관심이 없다.

+0

실제 타입 패밀리는'ServerT'이며,'Server'는'Handler' 모나드를 사용하는'ServerT'의 편리한 동의어입니다. –

답변

1

이 작업을 자동으로 수행하는 방법을 모르지만 safeLink 기능을 사용하여 "수동으로"수행 할 수 있습니다.

show (safeLink (Proxy::Proxy ServerAPI) (Proxy::Proxy Route3)) 
:

아이디어는 당신이 API

type ServerAPI = 
     "route01" :> Get '[HTML] Text 
    :<|> "route02" :> "subroute" :> Get '[HTML] Text 
    :<|> Route3 

type Route3 = "route03" :> Get '[HTML] Text 

이있는 경우는 전체 API 및 특정 경로와 프록시 safeLink에 프록시를 통과하고 URI을 결과를 보여줄 수 있다는 것입니다

경로에 매개 변수가있는 경우 처리기에서 가져온 매개 변수도 전달해야합니다. ghci에서

type ServerAPI = 
     ... 
    :<|> Route4 

type Route4 = "route04" :> Capture "cap" Int :> Get '[JSON] Text 

: 예를 들어

ghci> :set -XKindSignatures -XDataKinds -XTypeOperators -XTypeFamilies 
ghci> :type safeLink (Proxy::Proxy ServerAPI) (Proxy::Proxy Route4) 
Int -> URI 

각 경로에 대해이 작업을 수행해야합니다.