我想使用Play应用程序/ api将json文件上传到我的cassandra数据库。
我的html视图看起来像这样。
@main("Welcome to Play") {
<h1> Upload a JSON file </h1>
@helper.form(action = routes.Application.upload, 'enctype -> "text/json") {
<input type="file" name="jsonFile">
<p>
<input type="submit" value="Upload">
</p>
}}
我在控制器中定义了我的上传方法:
def upload = Action(parse.json) { request =>
val data = Json.arr(request.body)
sc.parallelize(Seq(data)).saveToCassandra("person", "user", SomeColumns("name", "age"))
Redirect("/index") }
我收到的错误消息是
Bad Request: For request 'POST /upload' [Expecting text/json or application/json body]
尝试使用enctype“application / json”并且没有区别。 如果我尝试打印内容,我会得到Null。
我的file.json的格式是:
{ "name": "alice", "age": 22}
{ "name": "bob", "age": 23}
基本上我似乎无法从文件中正确提取内容。
答案 0 :(得分:0)
请参阅文档的这一部分,关于请求正文解析器:
https://www.playframework.com/documentation/2.5.x/ScalaBodyParsers#Choosing-an-explicit-body-parser
基本上,parse.json
要求您使用Content-Type
application/json
发出请求。来自文档:
json正文解析器将验证请求是否具有Content-Type of application / json,如果请求不符合该期望,则发回415 Unsupported Media Type响应。因此,我们无需再次检查我们的操作代码。
还有另一个没有此要求的身体解析器。再次,来自文档:
这当然意味着客户必须表现良好,向他们的请求发送正确的Content-Type标头。如果你想要更放松一点,你可以使用tolerantJson,它会忽略Content-Type并尝试将身体解析为json,无论如何:
def save = Action(parse.tolerantJson) { request => Ok("Got: " + (request.body \ "name").as[String]) }
所以,你有两个选择:
parse.json
并将Content-Type
设置为application/json
parse.tolerantJson
除此之外,如果内容如下所示,则JSON文件无效:
{ "name": "alice", "age": 22}
{ "name": "bob", "age": 23}
您可以使用JSONLint进行检查,我还建议您阅读json.org处的定义。你可能想要一个像这样的数组:
[
{ "name": "alice", "age": 22},
{ "name": "bob", "age": 23}
]
更正格式后,您可以使用parse.json
或parse.tolerantJson
。