【问题标题】:Playframework Scala - Delete Route problemsPlayframework Scala - 删除路线问题
【发布时间】:2017-10-23 23:01:30
【问题描述】:

我正在为大学的期末项目使用 playframework,但在路由删除或放置方法时遇到了问题。 当我请求 DELETE 或 PUT 方法时,我得到:

[info] play.api.Play - 应用程序已启动(开发) [调试] a.ErrorHandler - onClientError: statusCode = 404, uri = /Rest/deleteCity, message ="

我的 JQuery ajax 调用是:

$("#scalaDelete").click(function(){
    $("#result").empty();   
    $.ajax({
        url: "http://localhost:9000/Rest/deleteCity",
        method: "DELETE",
        data: {city: "Alvorada"},
        dataType: "json",
        success: function(result){
            $("#result").append("Result: "+result.Result);
        },
        error: function (request, status, error) {
            alert(status);
        }
    });
});

我的路线 游玩路线:

DELETE       /Rest/deleteCity       controllers.RestController.deleteCity()

我的控制器方法:

case class UserDelete(city:String)
class RestController @Inject()(db: Database, cc: ControllerComponents) extends AbstractController(cc) {

val userDeleteForm = Form(
   mapping(
     "city" -> text
   )(UserDelete.apply)(UserDelete.unapply)
  )

  def deleteCity = Action{ implicit request=>
    val userPar = userDeleteForm.bindFromRequest.get
    //DatabaseDelete

    Ok(jsonResult)
  }

}

我已经在 chrome 中激活了跨域,我已经为它使用了 CORS 扩展。

感谢您的帮助

【问题讨论】:

    标签: scala rest methods playframework


    【解决方案1】:

    这似乎与Restful http delete in play 有关,即删除数据可能是粗略的。

    我不会传递数据,而是将其移至 url:

    DELETE       /Rest/deleteCity/:city   controllers.RestController.deleteCity(city: String)
    # or with a query string
    DELETE       /Rest/deleteCity   controllers.RestController.deleteCity(city: String)
    

    然后做

    http://localhost:9000/Rest/deleteCity/Alvorada
    # or with a query string
    http://localhost:9000/Rest/deleteCity?city=Alvorada
    

    我个人更喜欢后者。

    【讨论】:

    • 嗨,安迪,感谢您帮助我...我已经尝试了第二个,使用 QueryString,但我仍然从 play Server 获得 Not Found 方法。我取出了 Jquery Data 参数并使用 ?city=Alvorada 传递了 URL。在控制器方法上,我添加了 def deleteCity(city:String) =...
    • @DanielYanagita 只是为了尝试一些东西,它是否区分大小写?你能试试/rest/delete-city吗(通常这不是问题......)
    • @DanielYanagita 你也删除了 dataType 吗?
    • 我没有删除 dataType... 我想这不是区分大小写的问题,因为在路由文件上的链接是相同的,但我会尝试使用小写的请求并让你知道!谢谢朋友的关注
    • 其实不是大小写敏感的问题……我试过小写还是不行,还是找不到,而且post和get都正常……
    【解决方案2】:

    我同意@AndyHayden。

    Play 忽略了 DELETE 请求的正文,这在我看来是正确的行为,但您可以通过显式传递正文解析器来解决问题:

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

    (这个例子是由 Play 本身的开发者之一给出的: https://github.com/playframework/playframework/issues/4606#issuecomment-109192802.)

    关于cmets的疑惑

    我在这里看到另一个帖子,其中有人说某些浏览器只支持 get 和 post 方法。

    POSTGET 仅对form 标记的method 属性有效。

    您正在使用 javascript 请求,因此您可以使用服务器支持的任何方法。即DELETE 在那里完全没问题。

    但有趣的是,playframework 使用 akka,并且出于安全原因,该框架不支持 DELETE 请求,实际上在帖子中没有很好地解释。然后,如果你想创建一个 DELETE 方法,你必须创建一个 post 方法来完成你的代码。

    Akka HTTP 支持 DELETE 请求(以及 Play Framework):https://doc.akka.io/docs/akka-http/current/scala/http/routing-dsl/directives/method-directives/delete.html

    【讨论】:

    • 嗨,首先感谢您的帮助;)所以,如果我理解了 akka 文档所说的内容,我必须创建一个对其进行编码的路由,在路由文件上是行不通的。我已经说过不支持 DELETE,因为我的服务器已经回复了我一个警告,说出于安全原因不支持它......我将尝试通过代码创建自定义路由。非常感谢
    • 嗨@AndriyKuba,很抱歉迟到了测试和反馈......那么你们都是对的,有两种方法可以实现删除。第一个通过 post 传递值并在 route.config 中创建一个简单的 post 路由。第二个通过 Get 传递值,但为了获得成功,我必须将 Route.config 指向路由方法并对其进行编码。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-08-17
    • 2018-03-15
    • 2018-03-15
    • 2020-01-12
    • 2018-02-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多