当前位置: 首页 > 知识库问答 >
问题:

播放框架。在相同的操作中接受JSON和Form Submit

濮阳奇逸
2023-03-14

我使用PlayScala框架编写了这个示例应用程序。(类型安全激活器)

package controllers

import play.api.mvc._
import models._


object Application extends Controller {

  def index = Action {
        Ok(views.html.main(Person.form))
  }

  def submit = Action { implicit request =>
    Person.form.bindFromRequest().fold(
            formWithErrors => BadRequest(views.html.main(formWithErrors)),
            p => {
                Ok(s"Hi ${p.firstname} ${p.lastname}")
            }
        )
  }
}
package models

import play.api.data.Form
import play.api.data.Forms.{mapping, text, of}
import play.api.data.format.Formats.doubleFormat
import play.api.libs.json.{__, Reads, Writes}
import play.api.libs.functional.syntax._
import play.api.libs.json.Json

case class Person(firstname: String, lastname: String)

object Person {
    val form = Form(mapping(
          "firstname" -> text,
          "lastname" -> text
        )(Person.apply)(Person.unapply))

  implicit val readsPerson: Reads[Person] = (
    ((__ \ "firstname").read[String]) and
    ((__ \ "lastname").read[String])
  )(Person.apply _)  

  implicit val writesItem = Writes[Person] {
    case Person(firstname, lastname) =>
      Json.obj(
        "firstname" -> firstname,
        "lastname" -> lastname
      )
  }  
}

现在,这在浏览器中运行得非常好。

但是,当我尝试从curl调用操作时

curl -H "Content-Type: application/x-www-form-urlencoded" -X POST -d '{"firstname":"abhishek", "lastname":"srivastava"}' http://localhost:9000/

它会因一条冗长的HTML消息而失败。

我的理解是,如果我使用x-www-form-urlencoded,那么在发帖时,我可以接受来自HTML表单和JSON请求的请求。

我做错什么了吗?还是我的理解有缺陷?

基本上,我希望使用相同的控制器方法操作来服务json post请求以及html表单提交。

共有1个答案

澹台正业
2023-03-14

简短回答:在客户端设置Content-Type标题,在服务器端使用默认的主体解析器,一切都会像魔术一样工作:)将Action(parse.urlFormEncoded)替换为简单的Action,然后使用默认解析器。

长回答:

默认解析器将自动使用基于Content-Type标头的正确解析器,无论是Application/x-www-form-urlencodedApplication/json等。

然后,在您的post方法中,bindFromRequest将检查所有实体,确定设置了哪一个,是asFormUrlEncoded还是asJson,然后将其用于表单数据处理。

 类似资料:
  • 问题内容: 我想知道(我的Java应用程序的)播放框架版本与我的应用程序的Java版本之间是否有任何联系? 示例:如果我使用play 2.2.1并在计算机上安装了java8。我可以在代码中使用java8吗? 如果有连接。java8的第一个播放版本是什么? 谢谢你妮芙 问题答案: Play 2.3.x是提及Java 8的第一个版本,请参见此处 今天早晨,我正在与我的一位同事交谈,他发现运行2.1.x

  • 在用400k记录查询MongoDb时,我得到了< code>OutOfMemoryError。我收集了大约40万条用户记录。当我试图检索所有用户(在弹性搜索中转储)时,我得到了< code>OutOfMemoryError错误。 我已经浏览过这个链接,在application.config中添加了jvm.memory=-Xms64m -Xmx1024m,但还是一样的异常。 这是我的堆栈跟踪 -

  • 而是使用EventStream而不是ArchivedEventStream,当我运行命令alert(通知)消息时,会转到除原始发件人之外的所有连接套接字,我也可以如何发送到原始发件人。 这是我的模型和控制器,使用WebSocket 事件模型 这是控制器

  • Rest服务器(Play Framework)中的相关问题在负载测试期间出现“读取超时”异常 java版本“1.8.0_31”java(TM)SE运行时环境(Build1.8.0_31-B13)java HotSpot(TM)64位服务器VM(Build25.31-B07,混合模式) 我正在我的本地PC中测试jmeter。我使用了2000个线程,出现了超时异常,并且Socket不知为什么没有关闭。

  • 我正在尝试使用PlayJava模板创建小型CRUD应用程序。我通过cmd使用typesafeactivator创建了一个新项目,所以现在我想启用ebean并更改mysql数据库。im使用激活器1.3。6,对于使用我的phpmyadmin sql 5.6的sql im。20我在谷歌上搜索了一下,我做了所有的事情,比如纪录片,但我仍然无法解决我的问题我无法添加ebean我的项目,我无法连接mysql连

  • 如果有人能抛出关于如何修改以下播放框架日志过滤器(ref.play filters)以实现以下目标的指针,我将不胜感激: null