0

私は play、scala、reactivemongo が初めてで、誰かが次のコードをわかりやすい言葉で説明してくれるかどうか疑問に思っていました。

def createFromJson = Action.async(parse.json) { request =>
import play.api.libs.json.Reads._

val transformer: Reads[JsObject] =
  Reads.jsPickBranch[JsString](__ \ "name") and
    Reads.jsPickBranch[JsNumber](__ \ "age") and
    Reads.jsPut(__ \ "created", JsNumber(new java.util.Date().getTime())) reduce

request.body.transform(transformer).map { result =>
  collection.insert(result).map { lastError =>
    Logger.debug(s"Successfully inserted with LastError: $lastError")
    Created
  }
}.getOrElse(Future.successful(BadRequest("invalid json")))}

名前と年齢の属性を持つJSONユーザーからユーザーを作成することを知っています。私が理解していないのは、入力 JSON がこのメソッドで読み取られる方法です。また、Action.async(par.json)、request => getorElse、Future などの概念。

また、このメソッドを作成するためのより簡単で簡単な方法があれば大歓迎です。

前もって感謝します!

4

1 に答える 1

2

このコードは、優れたリアクティブ mongo ドキュメントに従って作成したテンプレートで見つけたと思います。

説明する義務が少しあります。コードを実行してみましょう。

def createFromJson = Action.async(parse.json) { request =>

関数 createFromJson は、JSON 形式のボディを処理する非同期の (結果の未来を返す) アクション (再生のもの) を返します。そのために、リクエストを使用します。

ドキュメント: https://www.playframework.com/documentation/2.5.x/ScalaAsync

json は、配列、文​​字列、オブジェクトなど、json 形式に従うものであれば何でも構いません。

トランスフォーマーは、必要なデータのみを json から取得し、クリーンな json オブジェクトを返します。

val transformer: Reads[JsObject] =
  Reads.jsPickBranch[JsString](__ \ "name") and
    Reads.jsPickBranch[JsNumber](__ \ "age") and
    Reads.jsPut(__ \ "created", JsNumber(new java.util.Date().getTime())) reduce

ご覧のとおり、ブランチを文字列として、ブランチの年齢を数値として選択します。また、作成時に作成されたフィールドを最終的な json オブジェクトに追加します

ご覧のとおり、これを Person インスタンスに変換していません。

val transformer: Reads[JsObject] ....

Play は、より簡単な方法で json を処理するいくつかの方法を提供します。この例では、モデルに変換せずに json 値を直接操作することの威力を示しています。たとえば、ケースクラスがある場合

case class Person(name: String, age: Int)

そこから読み取りを自動的に作成できます。

val personReads: Person[Person] = Json.reads[Person]

しかし、Mongo DB に保存するだけでは、このインスタンスを構築してから再度 json に変換する必要はありません。もちろん、モデルを挿入する前に何らかのロジックを実行する必要がある場合は、モデルを作成する必要があります。

ドキュメンテーション:

これを念頭に置いて、コードの残りの部分は明確にする必要があります

request.body.transform(transformer).map { result =>
  collection.insert(result).map { lastError =>
    Logger.debug(s"Successfully inserted with LastError: $lastError")
    Created
  }
}

リクエストからボディ (JsValue) を取得し、それを JsObject (結果) に変換して、コレクションに挿入します。Insert は最後のエラーで Future を返します。Person が格納されると、最後のエラーがログに記録され、Created (201 コード) が API のクライアントに返されます。

最後のビットも今ではクリアされているはずです

}.getOrElse(Future.successful(BadRequest("invalid json")))

リクエストの json ボディを解析して JsObject に変換する際に問題が発生した場合は、結果として BadRequest (400 コード) を含む既に完了した Future がクライアントに返されます。Action.Async は戻り値の型として結果の未来を必要とするため、これは未来です。

スカラを楽しむ。

于 2016-03-15T09:46:27.527 に答える