2017-11-13 6 views
0

저는 플레이 프레임 워크가있는 스칼라 애플리케이션을 개발하고 있습니다. 외부 서버에서 오는 모든 요청을 필터링하는 필터를 만들었지 만 지금은 어떻게 실행해야합니까? 이일 이후 수요 필터링, 나는 그 (30)가 잘요청시 스칼라 재생 프레임 워크를 실행하는 방법

GET /api/v1/:locale/:uuid core.controllers.MyClass.myAction1(locale: String) 
GET /api/v1/:locale/:uuid/MyRoute core.controllers.MyClass.myAction2(locale: String) 
GET /api/v1/:locale/:uuid/Foo core.controllers.MyClass.myAction3(locale: String) 
GET /api/v1/:locale/orders/:orderId core.controllers.MyClass.myAction4(locale: String) 

같은 요청은, 그 루트는 루트 파일에 배치하는 동안 내가 요청 경로 템플릿을 읽을 수있는 방법, 특정 필터를 실행하는 데 필요한 80 API를 가지고 , 필터에 나는 경로가 : uuid가이거나 : orderId가이면 날씨를 확인해야합니다. 왜냐하면 특정 필터를 실행하기 위해서입니다. 왜냐하면 b 그들의 id의 oth, 내가 Uuid로 그들을 얻는 것은 내가 요청을 기대할 수 없기 때문에, 나는 경로 템플릿을 읽을 수 있을까?

답변

1

당신은 RequestHeader#attrs 일부 라우팅 정보에 액세스 할 수 있습니다 : 당신은 몇 가지 일반적인 로직을 실행하는 80 개 조치 30 개를 선택하려면

// in your filter 
val handlerDef: Option[HandlerDef] = request.attrs.get(Router.Attrs.HandlerDef) 

HandlerDef api

+0

나는 이것이 가장 좋은 방법은, 내가 URL 템플릿 –

+0

음에 대한 관심, 왜 url 변수이 /API/V1과 같은 정규 표현식을 표시 메이크업으로 많은 필터를 만들 수 있습니다 생각/$ locale <[^/]+>/ 여기에 무슨 일이 일어나는지 말해 주시겠습니까 –

+0

라우터 구현을 생성하기 전에 라우팅 파일이 해석되고 해석됩니다. 라우팅 파일에서 정규 표현식을 사용할 수 있습니다 : https://www.playframework.com/documentation/2.6.x/ScalaRouting#Dynamic-parts-with-custom-regular-expressions '/ api/v1/: 로케일 /'정규 표현식을 사용하도록 다시 작성하므로 프레임 워크에서 직접 사용할 수 있습니다. – vdebergue

1

를 참조하십시오, 당신은 또한 사용을 고려할 수있다 " 액션 빌더 (action builder) "에게 그 논리를 제공한다.

Action { ... }을 사용하면 바닐라 액션이 발생합니다. Action을 감싸고 사용자 지정 논리를 실행하는 자신 만의 MyAction { ... }을 만들 수도 있습니다. 이것은 ActionBuilder입니다. 이 접근 방식을 사용하면 30 개의 액션을 업데이트하여 해당 액션 빌더를 사용해야합니다.

참조 : https://www.playframework.com/documentation/2.6.x/ScalaActionsComposition#Custom-action-builders

+0

조치 작성기가 조금 어려울 것이라고 생각합니다. –

+0

'HandlerDef'도 괜찮습니다. . 실제로 요청 프레임 워크에 HandlerDef를 ​​저장하는 코드를 Play Framework에 작성했습니다. :) 액션 빌더의 이점은 물건이 타입 안전하고 명시 적이라는 것입니다. 그러나 때때로 필터가 더 나은 옵션입니다. –