Yii2 RESTful API post() 来自 PUT 不返回参数
Yii2 RESTful API post() from PUT not returning parameters
我用只允许更新密码的标准 REST actionUpdate 替换了:
class UserController extends ActiveController
{
// ...
public function actions()
{
$actions = parent::actions();
unset($actions['update']);
return $actions;
}
// ...
public function actionUpdate($id)
{
if (! Yii::$app->request->isPut) {
throw new MethodNotAllowedHttpException('Please use PUT');
}
/** @var User $user */
$user = User::findIdentity($id);
if (Yii::$app->request->post('password') !== null) {
$user->setPassword(Yii::$app->request->post('password'));
}
return $user->save();
}
// ...
}
[编辑] 这是用户模型:
<?php
namespace app\models\user;
use Yii;
use yii\base\NotSupportedException;
use yii\web\IdentityInterface;
class User extends \yii\db\ActiveRecord
implements IdentityInterface
{
public static function tableName()
{
return 'Users';
}
public function rules()
{
return [
[['username', 'password_hash', 'email'], 'required'],
[['role', 'status'], 'integer'],
[['username', 'email', 'last_login'], 'string', 'max' => 255],
[['username'], 'unique'],
[['email'], 'email'],
[['auth_key'], 'string', 'max' => 32],
[['password'], 'safe'],
];
}
public function beforeSave($insert)
{
$return = parent::beforeSave($insert);
if ($this->isNewRecord)
$this->auth_key = Yii::$app->security->generateRandomKey($length = 255);
return $return;
}
public function getId()
{
return $this->id;
}
public static function findIdentity($id)
{
return static::findOne($id);
}
public function getAuthKey()
{
return $this->auth_key;
}
public function validateAuthKey($authKey)
{
return $this->getAuthKey() === $authKey;
}
public function getPassword()
{
return $this->password_hash;
}
public function setPassword($password)
{
$this->password_hash = Yii::$app->security->generatePasswordHash($password);
}
public static function findIdentityByAccessToken($token, $type = null)
{
throw new NotSupportedException('You can only login by username/password pair for now.');
}
public function validatePassword($password)
{
return Yii::$app->security->validatePassword($password, $this->password_hash);
}
}
[/编辑]
使用 Postman 和 Codeception 进行测试,[Response] = true 且 [Status] = 200。两者均符合预期。但是,更新不带。
[请求] =
PUT http://localhost:8888/api/v1/users/1 {"password":"anotherpassword"}
...这是正确的。当我 print_r
Yii::$app->request->post()
在 actionUpdate 中,它 returns 一个空数组。模型规则将 'password' 列为安全。
有什么想法吗?
马哈洛,
乔
以下是最终对我有用的方法,以防其他人感兴趣。对于 Postman,我将 Json 参数放在请求正文中(而不是作为参数)。
在 Codeception 中,我得到了线索 here。我不得不
$I->haveHttpHeader('Content-Type','application/json');
在 $I->sendPUT(...) 之前。
希望这对下一个人有帮助...
我用只允许更新密码的标准 REST actionUpdate 替换了:
class UserController extends ActiveController
{
// ...
public function actions()
{
$actions = parent::actions();
unset($actions['update']);
return $actions;
}
// ...
public function actionUpdate($id)
{
if (! Yii::$app->request->isPut) {
throw new MethodNotAllowedHttpException('Please use PUT');
}
/** @var User $user */
$user = User::findIdentity($id);
if (Yii::$app->request->post('password') !== null) {
$user->setPassword(Yii::$app->request->post('password'));
}
return $user->save();
}
// ...
}
[编辑] 这是用户模型:
<?php
namespace app\models\user;
use Yii;
use yii\base\NotSupportedException;
use yii\web\IdentityInterface;
class User extends \yii\db\ActiveRecord
implements IdentityInterface
{
public static function tableName()
{
return 'Users';
}
public function rules()
{
return [
[['username', 'password_hash', 'email'], 'required'],
[['role', 'status'], 'integer'],
[['username', 'email', 'last_login'], 'string', 'max' => 255],
[['username'], 'unique'],
[['email'], 'email'],
[['auth_key'], 'string', 'max' => 32],
[['password'], 'safe'],
];
}
public function beforeSave($insert)
{
$return = parent::beforeSave($insert);
if ($this->isNewRecord)
$this->auth_key = Yii::$app->security->generateRandomKey($length = 255);
return $return;
}
public function getId()
{
return $this->id;
}
public static function findIdentity($id)
{
return static::findOne($id);
}
public function getAuthKey()
{
return $this->auth_key;
}
public function validateAuthKey($authKey)
{
return $this->getAuthKey() === $authKey;
}
public function getPassword()
{
return $this->password_hash;
}
public function setPassword($password)
{
$this->password_hash = Yii::$app->security->generatePasswordHash($password);
}
public static function findIdentityByAccessToken($token, $type = null)
{
throw new NotSupportedException('You can only login by username/password pair for now.');
}
public function validatePassword($password)
{
return Yii::$app->security->validatePassword($password, $this->password_hash);
}
}
[/编辑]
使用 Postman 和 Codeception 进行测试,[Response] = true 且 [Status] = 200。两者均符合预期。但是,更新不带。
[请求] =
PUT http://localhost:8888/api/v1/users/1 {"password":"anotherpassword"}
...这是正确的。当我 print_r
Yii::$app->request->post()
在 actionUpdate 中,它 returns 一个空数组。模型规则将 'password' 列为安全。
有什么想法吗?
马哈洛, 乔
以下是最终对我有用的方法,以防其他人感兴趣。对于 Postman,我将 Json 参数放在请求正文中(而不是作为参数)。
在 Codeception 中,我得到了线索 here。我不得不
$I->haveHttpHeader('Content-Type','application/json');
在 $I->sendPUT(...) 之前。
希望这对下一个人有帮助...