2

スプレー ルーティング アクターで application/json を content-Type として設定しようとしています。しかし、応答に表示されるコンテンツ タイプは常にテキスト/プレーンです。スプレー ルーティング アプローチ (「something」) とスプレー缶アプローチ (「something2」) を使用してみましたが、2 つのルートは応答タイプを適切に送信しません。私は何か見落としてますか?

def receive = runRoute {        
    path("something") {
      get {
        respondWithHeader(`Content-Type`(`application/json`)) {
          complete("""{ "key": "value" }""")
        }
      }
    } ~
    path("something2") {
      get {
        complete(HttpResponse(entity = """{ "key": "value" }""").withHeaders((List(`Content-Type`(`application/json`)))))
      }
    }
  }`enter code here`
4

2 に答える 2

1

文字列のマーシャラーによってレスポンスヘッダーが上書きされているようです。

このように、それは魅力のように機能します:

path("something") {
  get {
    respondWithMediaType(`application/json`) {
      complete("""{ "key": "value" }""")
    }
  }
}
于 2014-02-28T10:12:48.107 に答える
1

json実際には、application/jsonコンテンツ タイプと spray.jsonモジュールを使用して を返す、はるかに優れた方法があります。ペアしかない場合はkey:value、SprayJsonMarshaller を使用すると、適切なヘッダーが自動的に設定されます。次の例を検討してください。

(get & path("somePath")) { complete(Map("key" -> "value")) }

json 応答を作成するには、次の 2 つをインポートするだけです。

import spray.json.DefaultJsonProtocol._ // contains default marshallers
import spray.httpx.SprayJsonSupport._   // will do all the headers work

ネットワーク経由で送信したい独自のケース クラスがある場合は、json 形式へのコンバーターを提供します。

import spray.json.DefaultJsonProtocol._

case class SomeClass(name: String)
object SomeClass {
  implicit val someClassJson = jsonFormat1(SomeClass.apply)
}

後で応答の形式を変更したい場合は、マーシャラーを変更してコードを書き直すだけでよいため、はるかに優れたアプローチです。

jsonFormat メソッドの末尾の number は、ケース クラスの引数の数と同じです。

于 2014-03-01T06:56:07.930 に答える