Yii Restful API将在POST上创建,但不会填充任何变量

时间:2013-08-16 19:42:24

标签: json api rest post yii

您好我正在尝试使用POSTMAN来测试基于此帖子的早期API http://www.yiiframework.com/wiki/175/how-to-create-a-rest-api/

我在尝试通过POST以php url样式提交变量或甚至发送对象时出错。来自API的响应返回200并且它创建了一个新的数据库条目,但不幸的是它不会从post变量或jason对象获取任何信息,它只是出现null。现在看来,该代码只是通过$ _POST变量查找并尝试将它们与模型变量匹配,如果是这样,它应该更新它保存它,但是当我尝试通过POSTMAN中的url参数发送甚至更改内容类型时json和发送原始json对象我似乎没有运气。

另外我真的只需要它来解码一个jason对象而不是发布参数所以也许这就是我将从删除$ post循环并开始检索JSON对象开始的地方。谢谢你的帮助!

public function actionCreate()
{
    switch($_GET['model'])
    {
        // Get an instance of the respective model
        case 'event':
            $model = new Event;                    
            break; 
        case 'media':
            $model = new Media;                    
            break; 
        case 'comment':
            $model = new Comment;                    
            break;
        default:
            $this->_sendResponse(501, 
                sprintf('Mode <b>create</b> is not implemented for model <b>%s</b>',
                $_GET['model']) );
                Yii::app()->end();
    }
    // Try to assign POST values to attributes
    foreach($_POST as $var=>$value) {
        // Does the model have this attribute? If not raise an error
        if($model->hasAttribute($var))
            $model->$var = $value;
        else
            $this->_sendResponse(500, 
                sprintf('Parameter <b>%s</b> is not allowed for model <b>%s</b>', $var,
                $_GET['model']) );
    }
    // Try to save the model
    if($model->save())
        $this->_sendResponse(200, CJSON::encode($model));
    else {
        // Errors occurred
        $msg = "<h1>Error</h1>";
        $msg .= sprintf("Couldn't create model <b>%s</b>", $_GET['model']);
        $msg .= "<ul>";
        foreach($model->errors as $attribute=>$attr_errors) {
            $msg .= "<li>Attribute: $attribute</li>";
            $msg .= "<ul>";
            foreach($attr_errors as $attr_error)
                $msg .= "<li>$attr_error</li>";
            $msg .= "</ul>";
        }
        $msg .= "</ul>";
        $this->_sendResponse(500, $msg );
    }
}

2 个答案:

答案 0 :(得分:3)

通过删除$ POST循环并仅更改为JSON对象方案来解决。这是代码,如果有人碰巧发现自己处于这种情况。

//read the post input (use this technique if you have no post variable name):
$post = file_get_contents("php://input");

//decode json post input as php array:
$data = CJSON::decode($post, true);

//load json data into model:
$model->attributes = $data;

使用它代替foreach循环通过$ _POST变量。现在它接受一个json对象。快乐的编码全部!

答案 1 :(得分:0)

老实说,我不确定你的问题是什么。如果您可以在$_POST中看到POST但未分配给$model的值,则可能是因为您没有为模型中的这些字段指定验证规则。如果您不需要验证字段,只需在模型的'safe'函数中将其标记为rules(),如下所示。

public function rules() {
    return array(
        array('fieldName1,fieldName2', 'safe'),
    );
}