response组件的format配置无效? [ 2.0 版本 ]
在进行RESTful时,默认输出格式是xml,我在web.php配置
'response' => ['format' => 'json',],
'urlManager' => [
'enablePrettyUrl' => true,
'enableStrictParsing' => true,
'showScriptName' => false,
'rules' => [
['class' => 'yii\rest\UrlRule', 'controller' => ['player', 'custom']],
],
],
// yii\web\Application类
public function handleRequest($request)
{
if (empty($this->catchAll)) {
list ($route, $params) = $request->resolve();
} else {
$route = $this->catchAll[0];
$params = array_splice($this->catchAll, 1);
}
try {
Yii::trace("Route requested: '$route'", __METHOD__);
$this->requestedRoute = $route;
$result = $this->runAction($route, $params);
if ($result instanceof Response) {
return $result;
} else {
$response = $this->getResponse();
//在这个地方打印$response,它的format属性还是默认值xml,没有改变?
if ($result !== null) {
$response->data = $result;
}
return $response;
}
} catch (InvalidRouteException $e) {
throw new NotFoundHttpException($e->getMessage(), $e->getCode(), $e);
}
}
为什么response对象的format属性还是xml
最佳答案
-
yii\rest\Controller 有定义了一个 behavior
/** * @inheritdoc */ public function behaviors() { return [ 'contentNegotiator' => [ 'class' => ContentNegotiator::className(), 'formats' => [ 'application/json' => Response::FORMAT_JSON, 'application/xml' => Response::FORMAT_XML, ], ], 'verbFilter' => [ 'class' => VerbFilter::className(), 'actions' => $this->verbs(), ], 'authenticator' => [ 'class' => CompositeAuth::className(), ], 'rateLimiter' => [ 'class' => RateLimiter::className(), ], ]; }
contentNegotiator
这个filter
会根据 客户端的Accept
请求头, 重设Response
的format
属性,yii\filters\ContentNegotiator
简单说就是 如果
Accept: application/xml
, 则format
会被设置为xml
,如果是Accept: application/json
会被设置为json
,你可以在web.php
里面设置一个默认值,请求的时候会根据Accept
请求头自动重设format
属性,你的应用可以自适应xml
,或者json
,或者,把这个filter
去掉,应用一直使用json
格式你的问题可能就是,应用发送了
Accept: application/xml
请求头,发送json
请求头就 ok 了
其他 0 个回答
没有找到数据。
jayce
注册时间:2014-12-10
最后登录:2015-06-09
在线时长:48小时16分
最后登录:2015-06-09
在线时长:48小时16分
- 粉丝5
- 金钱175
- 威望0
- 积分655