【问题标题】:How to handle json payload in GET request Play 2.0 + Scala如何在 GET 请求 Play 2.0 + Scala 中处理 json 有效负载
【发布时间】:2012-10-12 09:51:57
【问题描述】:

我想为 GET 请求创建一个处理程序/控制器,例如在 ElasticSearch 中:

$ curl -XGET 'http://localhost:9200/twitter/tweet/_search?routing=kimchy' -d '{
"query": {
    "filtered" : {
        "query" : {
            "query_string" : {
                "query" : "some query string here"
            }
        },
        "filter" : {
            "term" : { "user" : "kimchy" }
        }
    }
}}

我从http://www.playframework.org/documentation/2.0.4/ScalaJsonRequests 阅读了文档,但该示例基于 POST 请求。我自己尝试过,看来我可以使用 POST 请求访问正文请求。但是,当我尝试使用 GET 请求时,我的 request.body 是 AnyContentAsEmpty。

有没有办法在 Play 2.0 中处理来自这个请求的 json?


我看到 GET 没有正文语义:Payloads of HTTP Request Methods。 所以也许通过Play 2.0没有机制处理是正常的。

【问题讨论】:

    标签: scala playframework-2.0


    【解决方案1】:

    我相信您对每种类型的请求的期望值感到困惑。总结一下:

    1. GET 请求在 URL 中包含有效负载,没有请求正文 添加了
    2. POST 请求将负载添加到请求正文中

    从您发布的示例中,您似乎希望从 GET 请求中返回 Json 答案,这会更有意义。

    这可以通过制作 Json 字符串并使用 Ok(result).as("application/json") 设置响应的 MIME 类型来轻松实现。

    【讨论】:

    • 感谢您的回答,但我认为我没有很好地解释我的问题。我不想创建一个返回 json 的处理程序。我想创建一个可以从 GET 请求中读取 json 的处理程序。我的示例是使用 curl 的 elasticsearch 的基本示例。您使用 json 向 elasticsearch 服务器执行 GET(来自 curl 的 -XGET)请求。然后elasticsearch服务器返回搜索的json结果。也许我不明白在这种情况下 curl cmd 是如何工作的。我的猜测是 -d 强制请求使用 POST:-d 将 POST 请求中的指定数据发送到 HTTP 服务器
    • 正如我在帖子中所说,关于 linklink 似乎可以在 GET 请求中发送请求正文。因此,强烈建议避免这种事情。我错了吗?
    • @alexgindre 是的,GET 使用 URL,POST 正文。使用 -d 您正在执行 POST 请求,通过 GET 发送 json 可以通过对其进行编码并将其添加为参数来完成,但我认为这不是一个好的选择,最好使用 POST。
    • @yesterday 谢谢你的帮助! curl cmd 用 -d 参数欺骗了我。即使看起来可以像我一样使用 GET,playframework 也不支持这一点,因为它太不正统了,我猜。我将使用 POST 或 PUT。
    【解决方案2】:

    this is a sample question

    Play 的默认正文解析器遵循 HTTP 规范,并忽略 GET、DELETE、HEAD 和 OPTIONS 方法的消息正文。如果你想强制它解析一个 body,你可以通过显式传递一个 body 解析器来做到这一点,例如:

     def delete = Action(parse.json) { implicit request =>
       val json = request.body
       val someProp = (json \ "someprop").as[String]
       Ok(s"Prop is: $someProp")
     }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-10-30
      • 2012-06-19
      • 2021-11-14
      • 2016-12-15
      • 1970-01-01
      相关资源
      最近更新 更多