我想通过使用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}
基本上,我似乎无法从文件中正确提取内容。
有关请求正文解析器,请参阅文档的本部分:
https://www.playframework.com/documentation/2.5.x/ScalaBodyParsers#Choosing-an-explicit-body-parser
基本上,parse.json
要求您提出一个请求Content-Type
的application/json
。从文档中:
json主体解析器将验证请求是否具有application / json的Content-Type,如果请求不符合该期望,则发送415不支持的媒体类型响应。因此,我们无需再次检查操作代码。
还有另一个没有此要求的正文解析器。再次,从文档:
当然,这意味着客户端必须表现得很好,并随其请求一起发送正确的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
。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句