2

您好我目前正在尝试使用 POSTMAN 来测试基于这篇文章 http://www.yiiframework.com/wiki/175/how-to-create-a-rest-api/的早期 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 );
    }
}
4

2 回答 2

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;

使用它而不是通过 $_POST 变量的 foreach 循环。现在它接受一个 json 对象。祝大家编码愉快!

于 2013-08-16T20:25:59.930 回答
0

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

public function rules() {
    return array(
        array('fieldName1,fieldName2', 'safe'),
    );
}
于 2013-08-16T20:19:47.940 回答