在进行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 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 了