您好我正在尝试使用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 );
}
}
答案 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'),
);
}