我在大学的最终项目中使用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扩展。
感谢您的帮助
答案 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方法。
POST
和GET
仅对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