我注意到CGridView按钮使用POST,但实际上没有POST任何东西。它对像GET这样的URL进行POST。
示例:
将POST空为site/controller/action/param1/value1/param2/value2
,而我认为它应该发布到site/controller/action
并在param1
中有param2
和POST body
。
是否可以改变它?
谢谢
答案 0 :(得分:1)
传递params作为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请求。