2013-10-02 6 views
4

클라이언트가 특정 Accept 헤더를 보내는 경우에만 일치하는 경로를 만들고 싶습니다. 나는 스프레이 1.2-20130822을 사용합니다.경로에서 특정 수락 헤더를 일치시키는 방법은 무엇입니까?

내가 경로 작업 좀하고 싶습니다 :

def receive = runRoute { 
    get { 
     path("") { 
     accept("application/json") { 
      complete(...) 
     } 
     } 
    } 
    } 

Here은 내가 accept() 함수를 사용하여 스펙을 발견,하지만 나는 그것이 작동하도록 내 스프레이 처리기에 가져올 무엇을 알아낼 수 없습니다 지시어로. 또한, 헤더 지시문에 다른 doc을 찾지 못했지만 이것들은 stubs입니다.

답변

5

:

def acceptOnly(mr: MediaRange*): Directive0 = 
    extract(_.request.headers).flatMap[HNil] { 
    case headers if headers.contains(Accept(mr)) ⇒ pass 
    case _          ⇒ reject(MalformedHeaderRejection("Accept", s"Only the following media types are supported: ${mr.mkString(", ")}")) 
    } & cancelAllRejections(ofType[MalformedHeaderRejection]) 

그럼 그냥 루트를 포장 : 당신이 할 수있는 경우

path("") { 
    get { 
    acceptOnly(`application/json`) { 
     session { creds ⇒ 
     complete(html.page(creds)) 
     } 
    } 
    } 
} 

그리고 그런데

최신 스프레이 1.2 야간, 1.2-20130928입니다 그것을 업데이트

+0

작은 버그가 있습니다. 두 개 이상의 'MediaRange'가 전달되고 일치하지 않는 경우'$ {mr : _ *} '의 문자열 보간은 실패합니다. '$ {mr} '으로 변경하면 출력이'mr'의 타입을 포함하고 있습니다 만, 의도하지 않은 것이 있습니다. – rompetroll

+2

@rompetroll 죄송합니다. 몰랐습니다. 고마워요. '$ {mr : _ *}'를'$ {mr.mkString (",")}'로 대체 할 수 있습니다. – 4lex1v

2

accept 지정 문은 사전 정의 된 지정 문이 없습니다. 사용 가능한 지시문 here의 전체 목록을 볼 수 있습니다.

def accept(required: String) = headerValueByName("Accept").flatMap { 
    case actual if actual.split(",").contains(required) => pass 
    case _ => reject(MalformedHeaderRejection("Accept", "Accept must be equal to " + required)) 
} 

는 단지 사용하십시오 스프레이 Route의 범위에이 코드를 넣어 당신이 당신의 질문에 표시된대로 :

그러나, 당신은 당신이 원하는 것을 수행하는 사용자 정의 지침을 만들기 위해 headerValueByName 지시어를 사용할 수 있습니다 .

내가 이런 식으로 할 것
+2

을 일해야 할 고맙습니다. 나는 아마도'actual == required'를'actual.split (",")에 required가 포함되어있는 경우 등으로 변경해야 할 것입니다. – rompetroll

관련 문제