2012-04-05 2 views
1

LIFT를 사용하여 RESTful API를 제공하고 있으며 POST에서 CORS (Cross-Origin Resource Sharing)를 사용하여 요청을 허용하도록이 API를 원합니다. GET 요청을 처리하는 CORS가 있습니다.HTTP OPTIONS verb handling with LIFT

크로스 원본 POST가 주어진 URL에서 OPTIONS을 먼저 호출하고 LIFT로 OPTIONS 요청을 받아들이는 방법을 찾지 못해서 문제가 있습니다.

내 질문은 : LIFT에서 주어진 경로에 대해 HTTP 동사의 OPTIONS를 허용 할 수 있도록 mixi하거나 내 serve{} 블록에 쓰려면 무엇이 필요합니까?

지금 사용하여 컬 내가 얻을 :

curl -X OPTIONS http://localhost:8080/path => [404] 

내가-M5 2.4 및 스칼라 2.9.1

편집 LIFT을 사용하고 있습니다 : pr1001의 제안을 바탕으로, 내가 RestHelper을 확장하려고했다 과 같이 :

import net.liftweb.http.provider._ 
import net.liftweb.http._ 

trait RestHelper extends net.liftweb.http.rest.RestHelper { 
    protected object Options { 
     // Compile error here with options_? 
     // because net.liftweb.http.Req uses LIFT's RequestType 
     def unapply(r: Req): Option[(List[String], Req)] = 
      if (r.requestType.options_?) Some(r.path.partPath -> r) else None 
    } 
} 

@serializable 
abstract class RequestType extends net.liftweb.http.RequestType { 
    def options_? : Boolean = false 
} 

@serializable 
case object OptionsRequest extends RequestType { 
    override def options_? = true 
    def method = "OPTIONS" 
} 

object RequestType extends net.liftweb.http.RequestType { 
    def apply(req: HTTPRequest): net.liftweb.http.RequestType = { 
     req.method.toUpperCase match { 
      case "OPTIONS" => UnknownRequest("OPTIONS") 
      case _ => net.liftweb.http.RequestType.apply(req) 
     } 
    } 

    def method = super.method 
} 

나는이 더 많은 작업은 다음처럼 나는 내 자신과 Req을 연장하고 싶지 않기 때문에 내가해야한다고 생각 RequestType impl.

저는 스칼라와 관련해서는 기술 수준이 낮습니다. 그래서 누군가가 제가 놓친 것이 있기 때문에 좀 더 간단한 해결책을 제공 할 수 있기를 바랍니다.

답변

1

RestHelper을 사용하고 있습니까? 그렇다면 응답 할 요청 유형을 지정하고 LiftResponse을 반환하십시오. 에 전달하는 부분 함수에서 Lift에 아직 OptionRequest이 없지만 사용자 고유의 버전으로 RequestType을 확장 할 수 있어야합니다. UnknownRequest - UnknownRequest("OPTION")처럼 - 트릭을 수행 할 수도 있습니다. CORS 지원을 추가하면 유용 할 것 같은

또한 그의 제안에 대한 pr1001하는 ...

+0

것은 예, RestHelper를 사용하고 난 다음 작업을 얻을 수 있었다. RequestType을 확장하는 것이 얼마나 힘든지 보겠습니다. 이것들은 아주 좋은 아이디어입니다, 감사합니다! 아무도 더 나은/더 쉬운 대답을 찾지 못하면 24 시간 안에이 대답을 받아 들일 것입니다. –

+0

좋습니다. 메일 링리스트가 작동한다면 메일 링리스트에 올려주세요. 유용한 기능 추가가 될 것 같아요. – pr1001

+0

몇 가지 조언이 필요한 내 바보 같은 구현으로 질문을 업데이트했습니다. 물론 메일 링리스트에도 올릴 것입니다. –

1

많은 감사 mailing list에 데리고 가치가있을 수도 있습니다.

import net.liftweb.http._ 

class RequestTypeImproved(requestType: RequestType) { 
    def options_? : Boolean = requestType.method == "OPTIONS" 
} 

trait RestHelper extends net.liftweb.http.rest.RestHelper { 
    implicit def req2ReqImproved(requestType: RequestType): RequestTypeImproved = { 
     new RequestTypeImproved(requestType) 
    } 

    protected object Options { 
     def unapply(r: Req): Option[(List[String], Req)] = 
      if (r.requestType.options_?) Some(r.path.partPath -> r) else None 
    } 
} 

다음 :

serve { 
    case req @ "path" Options _ => { 
     LiftResponse(...) 
    } 
}