Play 2.0 中文资料 - 处理和响应 JSON 请求



处理 JSON 请求

JSON 请求是一个以有效的 JSON 数据作为请求体的 HTTP 请求. 它必须指定 Content-Type 头为 text/json 或是 application/json 作为 mime 类型.

默认的, Action 使用 any content 作为 Body 解析器, 这让你接收 Body 并解析为 JSON (实际为 JsValue):
 1def sayHello = Action { request =>
 2  request.body.asJson.map { json =>
 3    (json \ "name").asOpt[String].map { name =>
 4      Ok("Hello " + name)
 5    }.getOrElse {
 6      BadRequest("Missing parameter [name]")
 7    }
 8  }.getOrElse {
 9    BadRequest("Expecting Json data")
10  }
11}

更好的(也是更简单的)办法是指定你自己的 BodyParser 用以告诉 Play 把类容 Body 直接解析为 JSON:
1def sayHello = Action(parse.json) { request =>
2  (request.body \ "name").asOpt[String].map { name =>
3    Ok("Hello " + name)
4  }.getOrElse {
5    BadRequest("Missing parameter [name]")
6  }
7}

注: 让使用 JSON Body 解析器, request.body 值就已经是一个有效的 JsValue 了.

你可以在命令行下用 cURL 进行测试:
1curl 
2  --header "Content-type: application/json" 
3  --request POST 
4  --data '{"name": "Guillaume"}' 
5  http://localhost:9000/sayHello

Unmi 注: curl 是 unix 簇系统下的命令,windows 下的 curl 当然也有,用法略有不同,在 Windows 下推荐用 Fiddler。上面命令在 shell 下换行的话需在每行后加上反斜杠 \,反斜杠的作用是把一个 shell 续行,所以需要在适当的地方加上空格,执行完命令就上下方向键看看刚刚执行的命令就知道,shell 知道把多行合成一行的。

回应是:
1HTTP/1.1 200 OK
2Content-Type: text/plain; charset=utf-8
3Content-Length: 15
4
5Hello Guillaume

Unmi 注: 在 Mac shell 下需给 curl 命令再加上 -i 才能看到响应头信息,否则只有 Hello Guillaume 行。如果用 -v 参数可以看到更详细的请求响应过程:


输出 JSON 响应

在我们前面的例子中处理了 JSON 请求, 但我们回应的是 text/plain 类型的数据. 让我们作点改变来向客户端送出有效的 JSON HTTP 响应数据:
 1def sayHello = Action(parse.json) { request =>
 2  (request.body \ "name").asOpt[String].map { name =>
 3    Ok(toJson(
 4      Map("status" -> "OK", "message" -> ("Hello " + name))
 5    ))
 6  }.getOrElse {
 7    BadRequest(toJson(
 8      Map("status" -> "KO", "message" -> "Missing parameter [name]")
 9    ))
10  }
11}

Unmi 注: 使用  toJson() 方法需要引入 play.api.libs.json.Json._ 。play.libs.Json 也有个 toJson(Any),但它返回的是 JsonNode 类型,而我们要的是  JsValue 类型。

现在回应的是:
1HTTP/1.1 200 OK
2Content-Type: application/json; charset=utf-8
3Content-Length: 43
4
5{"status":"OK","message":"Hello Guillaume"}
永久链接 https://yanbin.blog/play2-0-tutorials-cn-handling-and-serving-json-requests/, 来自 隔叶黄莺 Yanbin's Blog
[版权声明] 本文采用 署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0) 进行许可。