通过Play应用程序将json文件上载到Cassandra DB时出错

时间:2016-06-04 23:17:56

标签: json scala playframework cassandra playframework-2.0

我想使用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}

基本上我似乎无法从文件中正确提取内容。

1 个答案:

答案 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])
}

所以,你有两个选择:

  1. 使用parse.json并将Content-Type设置为application/json
  2. 使用parse.tolerantJson
  3. 除此之外,如果内容如下所示,则JSON文件无效:

    { "name": "alice", "age": 22} 
    { "name": "bob", "age": 23}
    

    您可以使用JSONLint进行检查,我还建议您阅读json.org处的定义。你可能想要一个像这样的数组:

    [
      { "name": "alice", "age": 22},
      { "name": "bob", "age": 23}
    ]
    

    更正格式后,您可以使用parse.jsonparse.tolerantJson