8

Acceptスプレーでは、指定されたヘッダーに応じて、さまざまなコンテンツ タイプで応答したいと考えています。rompetroll による質問でいくつかの提案を見てきましたが、それを行うための標準的な方法があるかどうかを知りたいです (つまり、単純または既に実装されています)。

本質的に、私が想像することは次のようなものです。

path("somepath") {
  get {
    // Find whatever we would like to return (lazily)
    ...
    // Marshall resource and complete depending on the `Accept` header
    ...
  }
}

前もって感謝します。

4

2 に答える 2

15

この commitのテストを参照してください。

参照用にここにコピーしました:

case class Data(name: String, age: Int)
object Data {
  import spray.json.DefaultJsonProtocol._
  import spray.httpx.SprayJsonSupport._

  // don't make those `implicit` or you will "ambiguous implicit" errors when compiling
  val jsonMarshaller: Marshaller[Data] = jsonFormat2(Data.apply)
  val xmlMarshaller: Marshaller[Data] =
    Marshaller.delegate[Data, xml.NodeSeq](MediaTypes.`text/xml`) { (data: Data) ⇒
      <data><name>{ data.name }</name><age>{ data.age }</age></data>
    }

  implicit val dataMarshaller: ToResponseMarshaller[Data] =
    ToResponseMarshaller.oneOf(MediaTypes.`application/json`, MediaTypes.`text/xml`)  (jsonMarshaller, xmlMarshaller)
}

次にcomplete、ルートで使用するだけで十分です。コンテンツタイプのネゴシエーションは自動的に処理されます。

get {
  complete(Data("Ida", 83))
}
于 2014-01-15T09:20:02.270 に答える
8

スプレーは実際にヘッダー値を調べて、Acceptそれに対して検証します。したがって、ルートが返された場合、application/jsonまたはtext/plainクライアントが受け入れるとimage/jpeg、スプレーが返され406 Not Acceptableます。クライアントが要求した場合、application/jsonまたはtext/plainこのルートから、一致するコンテンツ タイプの応答を受け取ります。

ここでの主なトリックは、戻りオブジェクトに正しいマーシャラーを使用することです。マーシャリングの詳細については、こちらを参照してください。

また、RespondWithMediaTypeディレクティブで MediaType をオーバーライドすることもできますが、正しいマーシャラーを使用する方がよいと思います。

于 2014-01-14T17:48:01.307 に答える