Skip to content

Latest commit

 

History

History
122 lines (103 loc) · 3.59 KB

ScalaJsonRequests.md

File metadata and controls

122 lines (103 loc) · 3.59 KB

JSON リクエストとレスポンス

JSON リクエストの処理

JSON リクエストは JSON データをリクエストボディに含む HTTP リクエストです。JSON リクエストは、Content-Type ヘッダに text/jsonapplication/json という MIME タイプを指定する必要があります。

Actionany content ボディパーサーをデフォルトで使います。これを利用して、リクエストボディを JSON (具体的には、JsValue) として取得することができます。

def sayHello = Action { request =>
  request.body.asJson.map { json =>
    (json \ "name").asOpt[String].map { name =>
      Ok("Hello " + name)
    }.getOrElse {
      BadRequest("Missing parameter [name]")
    }
  }.getOrElse {
    BadRequest("Expecting Json data")
  }
}

この場合、専用のBodyParser を指定することで Play にコンテントボディを直接的に JSON としてパースさせると、記述がシンプル化されてなお良いでしょう。

def sayHello = Action(parse.json) { request =>
  (request.body \ "name").asOpt[String].map { name =>
    Ok("Hello " + name)
  }.getOrElse {
    BadRequest("Missing parameter [name]")
  }
}

Note: JSON ボディパーサーを利用すると、request.body の値が直接 JsValue として扱えるようになります。

このアクションは、コマンドラインから cURL を使って以下のようにテストできます。

curl 
  --header "Content-type: application/json" 
  --request POST 
  --data '{"name": "Guillaume"}' 
  http://localhost:9000/sayHello

レスポンスは以下のようになります。

HTTP/1.1 200 OK
Content-Type: text/plain; charset=utf-8
Content-Length: 15

Hello Guillaume

JSON レスポンスの送信

前述の例ではリクエストを JSON で受けていましたが、レスポンスは text/plain として送信していました。これを、正しい JSON HTTP レスポンスを送り返すように変更してみましょう。

def sayHello = Action(parse.json) { request =>
  (request.body \ "name").asOpt[String].map { name =>
    Ok(toJson(
      Map("status" -> "OK", "message" -> ("Hello " + name))
    ))
  }.getOrElse {
    BadRequest(toJson(
      Map("status" -> "KO", "message" -> "Missing parameter [name]")
    ))
  }
}

レスポンスは以下のようになります。

HTTP/1.1 200 OK
Content-Type: application/json; charset=utf-8
Content-Length: 43

{"status":"OK","message":"Hello Guillaume"}

次ページ: [[XML | ScalaXmlRequests]]