4

Acceptクライアントが特定のヘッダーを送信した場合にのみ一致するルートを作成したいと考えています。スプレー1.2-20130822を使用します。

ルートを機能させたい:

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

関数を使用する仕様を見つけましたが、 Sprayaccept() -Handler にインポートしてディレクティブとして機能させるにはどうすればよいかわかりません。また、ヘッダー ディレクティブに関する他のドキュメントは見つかりませんでしたが、これらのスタブは見つかりませんでした。

4

2 に答える 2

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 nightly は1.2-20130928、できれば更新してください。

于 2013-10-02T07:47:48.970 に答える
2

ディレクティブと呼ばれる定義済みのディレクティブはありませんaccept。利用可能なディレクティブの完全なリストは、こちらで確認できます。

ただし、ディレクティブを使用して、必要なことheaderValueByNameを行うカスタム ディレクティブを作成できます。

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から、質問で示したように使用してください。

于 2013-10-02T07:27:36.227 に答える