Angular2 (передний) и Yii2 (конечный) — http.get с опцией ‘Content-Type’: ‘application/json’

#json #xml #angular #yii2

#json #xml #угловатый #yii2

Вопрос:

Я пытался подключить образец Angular2 «Tour of Heroes» в качестве интерфейсной части и фреймворк Yii2 в качестве серверного контроллера в yii2

 <?php
namespace appcontrollers;
use yiirestActiveController;
class HeroesController extends ActiveController
{

    public $modelClass = 'appmodelsHeroes';

    public function behaviors()
    {

        return       
        yiihelpersArrayHelper::merge(parent::behaviors(), [
            'corsFilter' => [
                'class' => yiifiltersCors::className(),
            ],
        ]);
    }
}
 

Результат (http://server.local/heroes ):

 <response>
<item>
<id>11</id>
<name>Mr. Nice</name>
<title>князь</title>
</item>
<item>
<id>12</id>
<name>Narco</name>
<title>граф</title>
</item>
<item>
<id>13</id>
<name>Bombasto</name>
<title>барон</title>
</item>
 

curl H ‘Content-Type’: ‘приложение / json’ ‘http://server.local/heroes ‘ работает совершенно правильно, и я получаю JSON

Но я не могу получить это в Angular2. http.get с параметрами Content-Type’: ‘application/json

 export class HeroService {
  private headers = new Headers({'Content-Type': 'application/json'});
  private options = new RequestOptions({ headers: this.headers});
  private heroesUrl ='http://server.local/heroes';// 'app/heroes';  // URL     to web api
  constructor(private http: Http) { }
  getHeroes(): Promise<Hero[]> {
               return this.http.get(this.heroesUrl, this.options      
    )
               .toPromise()
               .then(response => response.json().data as Hero[])
               .catch(this.handleError);
  }
 

Но я получаю пустого Героя[]

Комментарии:

1. какая-либо ошибка отображается в консоли вашего браузера? не могли бы вы также проверить, правильно ли отправлен запрос с вкладки «Сеть» инструмента разработки?

2. в консоли Chrome нет ошибок

Ответ №1:

Пожалуйста, прочитайте это форматирование ответа Yii или используйте это в своем контроллере

 public function behaviors()
    {
        $behaviors = parent::behaviors();


        // add CORS filter
        $behaviors['corsFilter'] = [
            'class' => yiifiltersCors::className(),
            'cors' => [
                'Origin' => ['*'],
                'Access-Control-Request-Method' => ['GET', 'POST', 'PUT', 'PATCH', 'DELETE', 'HEAD', 'OPTIONS'],
                'Access-Control-Request-Headers' => ['*'],
            ],

        ];
        $behaviors['contentNegotiator'] = [
            'class' => yiifiltersContentNegotiator::className(),
            'formats' => [
                'application/json' => yiiwebResponse::FORMAT_JSON,
            ],
        ];
        return $behaviors;
    }