Playframework Scala - 删除路线问题

时间:2017-10-23 23:01:30

标签: scala rest methods playframework

我在大学的最终项目中使用playframework,并且在路由delete或put方法时遇到问题。   当我要求DELETE或PUT方法时,我得到了:

  

[info] play.api.Play - 应用程序启动(开发)   [debug] 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扩展。

感谢您的帮助

2 个答案:

答案 0 :(得分:1)

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

我只是将其移到网址:

,而不是传递数据
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

我个人更喜欢后者。

答案 1 :(得分:0)

我同意@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。)

关于评论中的疑惑

  

我在这里看过另一篇文章,其中有人说某些浏览器只支持get和post方法。

POSTGET仅对method代码的form属性有效。

您正在使用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