2012-04-05 69 views
1

我使用LIFT來提供RESTful API,並且我希望此API允許使用CORS(跨源資源共享)進行POST的請求。我確實有CORS使用GET請求。HTTP選項使用LIFT處理動詞

我遇到問題了,因爲交叉源POST首先在給定的URL上調用OPTIONS,而我還沒有弄清楚如何使用LIFT接受OPTIONS請求。

我的問題是:我需要混合或寫入我的serve{}塊,以便我可以允許在LIFT中給定路徑使用HTTP動詞OPTIONS?

現在使用curl我得到:

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

我使用LIFT 2.4-M5和Scala 2.9.1

編輯:基於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。

我對Scala的技術水平肯定很低,所以我希望有人能提供一些更簡單的解決方案,因爲我確信我缺少一些東西。

回答

1

您使用的是RestHelper?如果是這樣,您可以指定要回復的請求的類型並返回LiftResponse。 Lift中沒有OptionRequest用於您傳遞給serve()的部分功能,但您應該能夠使用您自己的版本擴展RequestType。使用UnknownRequest - 正如UnknownRequest("OPTION") - 也可能有效。

這也可能是值得的mailing list撫養,作爲CORS的支持將是一個有益的補充...

+0

是的,我使用RestHelper。我會看到如何擴展RequestType。這些都是非常好的點子,謝謝!如果沒有人提出更好/更簡單的答案,我會在24小時內接受此答案。 – 2012-04-05 20:52:14

+0

好。請確保它在郵件列表中正確顯示,因爲我認爲這會是一個有用的功能。 – pr1001 2012-04-06 09:32:00

+0

我用自己愚蠢的實現更新了這個問題,需要一些建議。我也會發布到郵件列表當然。 – 2012-04-06 20:03:05

1

非常感謝pr1001了他的建議。我能得到它具有以下工作:

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(...) 
    } 
}