15

私はAkka-httpを試しています。うまくいけば、誰かが次の質問に光を当てることができます:

  1. リクエストの accept: ヘッダーに基づいて異なるルートを作成するにはどうすればよいですか? たとえば、「json」を処理するコード パスと「xml」リクエストを処理するコード パスが必要です (ヘッダーがない場合はデフォルトで「json」になります)。

  2. contentType を推測したくない場合、どのように指定すればよいですか? たとえば、以下のコードでは、json を compactPrint() で実行しようとしていますが、これにより文字列に変更されるため、"text/plain" になります。それをオーバーライドして、まだjsonであることをクライアントに伝えたいです。

私のコードは次のようなものです。

...
path("api") {
          get {
              complete {
                getStuff.map[ToResponseMarshallable] {
                  case Right(r) if r.isEmpty => List[String]().toJson.compactPrint
                  case Right(r) => r.toJson.compactPrint
                  case Left(e) => BadRequest -> e
                }
              }
          }
        }
...

この場合の応答は text/plain です。これは、compactPrint が文字列を作成するためです。批判大歓迎です。;)

4

3 に答える 3

10

次のようにコンテンツ タイプを定義できます。

complete {
           HttpResponse(entity = HttpEntity(ContentType(MediaTypes.`application/json`), """{"id":"1"}"""))
         }

次のようにカスタム ディレクティブを作成できます。

  def handleReq(json: String) = {
    (get & extract(_.request.acceptedMediaRanges)) {
      r =>
        val encoding: MediaRange =
          r.intersect(myEncodings).headOption
            .getOrElse(MediaTypes.`application/json`)
        complete {
          // check conditions here
         // HttpResponse(entity = HttpEntity(encoding.specimen, json)) //
        }
    }
  }

ルートでディレクティブを次のように使用します

val route = path("api"){ handleReq(json) }
于 2015-08-25T10:16:39.597 に答える
1

質問#1の潜在的な答えはこれのようですが、カスタムディレクティブまたはよりエレガントなものを介して行いたいと思います。残念ながら、Akka-Http カスタム ディレクティブのドキュメントが欠落しているようです。

// the encodings I want, in the order of preference
val myEncodings = Seq(MediaRange(`application/xml`),MediaRange( `application/json`))

    ...
    path("api") {
              (get & extract(_.request.acceptedMediaRanges)){  
                  r => 
                    val encoding = 
                      r.intersect(myEncodings).headOption
                         .getOrElse(MediaRange(`application/json`))
                  complete {
                         // check "encoding" here and make decision.
                  }
              }
            }
    ...

誰かがよりクリーンなものを提供できることを願っています。

于 2015-08-25T16:30:39.987 に答える