为什么 PUT 被发送到 show() 而不是 update()?

Why is PUT sent to show() instead of update()?

这是我的 edit() 方法:

  public static Result edit(Long id)
  {
    User user = User.findById(id);
    Form<User> form = new Form<User>(User.class).fill(user);

    return ok(edit.render(user, form));
  }

并且在浏览器中,它发送一个 PUT/users/1

这是我的路线简介:

GET     /users/new                  controllers.UsersController.newUser()
POST    /users                      controllers.UsersController.create()
GET     /users/:id                  controllers.UsersController.show(id: Long)
GET     /users/:id/edit             controllers.UsersController.edit(id: Long)
PUT     /users/:id                  controllers.UsersController.update(id: Long)

这是我的表格:

@helper.form(action = routes.UsersController.update(user.id)) {

  @helper.inputText(editUserForm("email"))
  @helper.inputText(editUserForm("username"))
  @helper.inputPassword(editUserForm("password"))

  <button type="submit" name="action" value="update">Update</button>
}

但是,当我访问 /users/1/edit 并单击更新按钮时,请求作为 http://localhost:9000/users/1?email=My+Email&username=My+Username&password=My+Password&action=update 而不是封装的表单数据发送,并且由 show() 而不是 update

任何人都可以更深入地了解这个问题吗?

问题是浏览器只支持从表单发送 POST 或 GET 请求。如果您查看表单中呈现的 HTML,您会看到它是这样写的:

<form action="/users/1" method="PUT">

但是由于浏览器不支持从表单发起PUT请求,所以浏览器会忽略method参数,默认使用默认方法,即GET。因此浏览器发出 GET 请求,Play 会相应地处理它。

因此您只能使用 POST 或 GET 与 HTML 形式。有变通办法,例如,您可以使用 JavaScript 劫持表单提交,并使用来自表单数据的 AJAX 发出 PUT 请求。