【问题标题】:Play Framework Scala REST DELETE播放框架 Scala REST DELETE
【发布时间】:2016-08-03 12:03:40
【问题描述】:

我试图弄清楚如何使用 Play Framework 使用 REST DELETE 功能。这是我所拥有的:

我的模特:

case class Task(id: Int, name: String, description: String, group: String)

object Task {

var list: List[Task] = Nil

def save(task: Task) = {
    list = list ::: List(task)
}

def all(): List[Task] = Nil

def delete(id: Int){
    val b = list.toBuffer
    b.remove(id)
    b.toArray
}

这是我的控制器中用于删除的内容:

def deleteTask(id: Int) = Action {
    Task.delete(id)
    Ok
}

还有我的路线:

DELETE /tasks/id controllers.TaskController.deleteTask(id: Int)

忘了说我的问题了!我如何运行它来测试并确保它正常工作?我使用命令:

curl --include --request POST --header "content-type: application/json" --data '{"id":4, "name": "test5", "description": "testdesc1","group": "groupc"}' http://localhost:9000/tasks

并且它正确发布。如何使用DELETE 执行类似操作?

【问题讨论】:

  • 您的代码似乎是正确的。您的具体问题是什么?
  • 对不起,我编辑了我的问题!
  • 使用删除 curl 请求?

标签: scala playframework


【解决方案1】:

您的 DELETE 请求目前未正确定义。如果您想将id 作为参数,则应该使用DELETE /tasks/:id

.

您的 Scala 代码中的问题在 b.remove(id) 线上 - 在这种情况下,b 实际上来自 BufferLike 类型,而 remove method 不符合您的用途。它实际上删除了指定 index 处的元素,而不是您提供的元素。因此,如果您提供 id=4 那么它将尝试删除第 5 个元素,并以 IndexOutOfBoundsException 失败,这是一个运行时异常,会导致您收到错误页面。您可以只使用 List 上的diff method,如下所示:val newList = list diff List(id)

您已经在 routes 文件中指定了它:您已经定义了一个 DELETE 请求 - 这意味着您的 curl 请求也应该是一个 DELETE 之一:

curl -X DELETE "http://localhost:9000/tasks/4"

使用DELETE 时没有要发布的正文 - 您只需指定要删除的资源的 ID。

奖励:考虑返回一些其他状态,如 HTTP 204 - 在处理删除时更直观

【讨论】:

  • 这对我不起作用。我按照您的指示编辑了路由请求并尝试了 curl 请求,但没有收到任何错误。它刚刚返回给我播放框架错误页面的 HTML 代码:i.imgur.com/b3b9WP8.png
  • 正在遇到错误 - 查看屏幕截图中的 <title> 标签。执行异常很可能是运行时错误。现在尝试使用curl -v -X DELETE "http://localhost:9000/tasks/4" 来查看整个输出,然后将其粘贴到此处
  • 你不需要检查它,问题实际上出在你的 Scala 代码中:看看我编辑的答案
猜你喜欢
  • 2011-08-16
  • 2015-08-03
  • 2013-09-22
  • 2015-06-09
  • 2013-07-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-06-22
相关资源
最近更新 更多