【问题标题】:Error uploading json file to a Cassandra DB through a Play application通过 Play 应用程序将 json 文件上传到 Cassandra DB 时出错
【发布时间】:2016-10-04 19:01:42
【问题描述】:

我想使用 Play 应用程序/api 将 json 文件上传到我的 cassandra DB。

我的 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}

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

【问题讨论】:

    标签: json scala playframework cassandra playframework-2.0


    【解决方案1】:

    请参阅文档的这一部分,关于请求正文解析器:

    https://www.playframework.com/documentation/2.5.x/ScalaBodyParsers#Choosing-an-explicit-body-parser

    基本上,parse.json 要求您使用 Content-Typeapplication/json 提出请求。来自文档:

    json 正文解析器将验证请求的 Content-Type 是否为 application/json,如果请求不符合预期,则返回 415 Unsupported Media Type 响应。因此我们不需要再次检查我们的操作代码。

    还有另一个正文解析器没有这个要求。同样,来自文档:

    这当然意味着客户端必须表现良好,在请求中发送正确的 Content-Type 标头。如果你想放松一点,你可以改用宽容Json,它会忽略Content-Type并尝试将body解析为json:

    def save = Action(parse.tolerantJson) { request =>
       Ok("Got: " + (request.body \ "name").as[String])
    }
    

    所以,你有两个选择:

    1. 使用parse.json 并将Content-Type 设置为application/json
    2. 使用parse.tolerantJson

    除此之外,如果内容如下,则您的 JSON 文件无效:

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

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

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

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

    【讨论】:

    • 我已经尝试了这两个选项以及更多。我也经历了播放文档中提到的所有方法,最终结果总是一个错误。如果我切换到 parse.operatorJson,我得到:对于请求'POST /upload' [Invalid Json: Unrecognized token 'jsonFile': was expected ('true', 'false' or 'null') at [Source: akka.util. ByteIterator$ByteArrayIterator$$anon$1@3758e9b6; line: 1, column: 10]] 也许我的 json 文件格式不正确?
    • 修复了错误请求错误。显然我不得不稍微改变一下 json 格式。谢谢你。但是,无论我尝试什么,我仍然无法访问相关文件的内容。我最多可以参考上传的 file.json,但不能参考内容。是否有一些特定的方法可以访问文件内的内容。因为从技术上讲,POST 的主体是文件本身,而不是内容。
    • 您必须编辑问题以添加您如何尝试上传文件的代码。
    • 我编辑了我的问题。删除了已解决的问题并更新了我当前的问题。我有处理整个上传过程的所有代码。
    • 我认为这不是使用 stackoverflow.com 的好方法。您可能应该接受此答案,以便其他用户能够看到原始答案和问题。请恢复您的编辑,接受此答案并打开一个新问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-26
    相关资源
    最近更新 更多