2012-04-05 14 views
1

LIFTを使用してRESTful APIを提供しています。このAPIでCORS(クロスソース・リソース共有)を使用したリクエストをPOSTに許可します。 CORSはGETリクエストを処理しています。LIFTを使用したHTTP OPTIONS動詞

クロスオリジンPOSTが最初に指定されたURLでOPTIONSを呼び出し、LIFTでOPTIONSリクエストを受け付ける方法がわからないため、問題があります。

私の質問は、serve{}ブロックにmixinするか、LIFTの指定されたパスにHTTP動詞OPTIONSを許可できるようにするには何が必要ですか?

今使ってカール私が取得:

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

私は-M5 2.4とScalaの2.9.1

EDIT 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(...) 
    } 
} 
関連する問題