我注意到 CGridView 按钮使用 POST,但实际上并没有发布任何内容。它像 GET 一样对 URL 进行 POST。
例子:
它 POST 空到site/controller/action/param1/value1/param2/value2
,而我认为它应该 POST 到site/controller/action
并拥有param1
和param2
in POST body
。
有可能改变它吗?
谢谢
为方便起见,将参数作为 GET 传递。在 Yii crud 中,有一个_loadModel
加载模型的方法,就是使用$_GET
param。但是,为了避免通过 GET 删除,检查它是否是发布请求。这是一些(精简到最低限度)示例:
private function _loadModel()
{
// Find method uses get here, for most actions it is fine
return User::model()->findByPk($_GET['id']);
}
// Destructive action
public function actionDelete()
{
// Check if it really comes from post
if(Yii::app()->request->isPostRequest())
{
$this->_loadModel()->delete();
}
else
{
throw new CHttpException(400, 'Invalid request. Please do not repeat this request again.');
}
}
对于 ajax,它是 GET 还是 POST 并不重要,在正常请求中,但是浏览器会在尝试刷新时要求您重新提交 POST 数据。
当浏览器开始使用 URL 预取时,开始推荐使用 POST 进行破坏性或内容更改操作,以获得更快的响应。在早期的 AJAX 应用程序中,通过 get 进行了大量破坏性操作。在浏览器中实现 URL 预取的结果是这些应用程序在示例查看列表时删除了所有记录:) 这是使用 POST 而不是 GET 的主要原因。但无论如何,蜘蛛可能会遵循这样的网址。这就是为什么在服务器端检查它是否真的是一个 POST 请求很重要。