Я использую Yii2, и для чего он стоит, я знаю основы и программировал какое-то время. Вероятно, это связано с отсутствием документации в этой области (Yii2 JSONP и ответы). Все, что я нахожу, - это примеры возврата ответа JSON, и ни один из них не показывает ответ JSONP.
Я начал здесь, кулинарная книга Yii: https://github.com/samdark/yii2-cookbook/blob/master/book/response-formats.md
Он показывает только примеры JSON и XML, но не JSONP. В нем указано использование FORMAT_JSONP
. Поэтому я заменил JSON-пример JSONP. Перейдите на URL-адрес, ничего, только пустую белую страницу. Поэтому я var_dump() данные, и да данные есть!
Поэтому после поиска Google для "yii2 jsonp", "yii2 jsonp error", "yii2 jsonp не работает", наряду с несколькими другими вариантами, я ничего не нашел. Я искал здесь SO, и только 2 вопроса появляются для "yii2 jsonp", ни одна из них не помогла.
Я перешел к документам Yii2. Здесь: http://www.yiiframework.com/doc-2.0/guide-runtime-responses.html Опять же, ни один пример JSONP и не так много говорить об этом, кроме FORMAT_JSONP
является допустимым типом формата...
Я могу использовать JSON просто отлично, однако я пытаюсь заполнить карту Google данными из ответа JSONP, поэтому мне нужен JSONP.
Вот мой контроллер:
public function actionMapapi()
{
\Yii::$app->response->format = \yii\web\Response::FORMAT_JSONP;
$data = User::find()->all();
return $data;
}
Когда я перехожу к URL-адресу, он просто белый. Я могу поместить штамп ('здесь') перед объявлением формата response->, и он печатает "здесь" на странице. Таким образом, к контроллеру обращаются очень хорошо. Если я поменяю FORMAT_JSONP
на FORMAT_JSON
он отлично работает, это просто не JSONP.
Кажется, есть пробел в том, как точно обрабатывать JSONP в документах Yii2, и не так много говорить об этом в Интернете (что я мог бы найти).
Вам нужно вернуть массив, который определяет ваш callback
и data
. Это довольно скрыто и упоминается здесь: http://www.yiiframework.com/doc-2.0/yii-web-jsonresponseformatter.html
Говорится:
$ useJsonp Использовать формат ответа JSONP. Когда это так, данные ответа должны быть массивом, состоящим из элементов данных и обратного вызова. Последнее должно быть именем функции JavaScript, а первое будет передано этой функции в качестве параметра.
Практически никаких примеров, которые я мог бы найти, я просто попытался сделать очевидным:
return ['data' => $arrayData, 'callback' => 'myCallback'];
Это сработало!
Полный источник моего контроллера:
public function actionMapapi()
{
\Yii::$app->response->format = \yii\web\Response::FORMAT_JSONP;
$callback = 'mapApiCallback';
$data = User::find()->all();
return ['callback' => $callback, 'data' => $data];
}
ПРИМЕЧАНИЕ. Нет, я не заполняю свою карту пользователями. Это всего лишь пример, и данные печатаются на экране очень хорошо. Мне все равно нужно закодировать его, чтобы вытащить данные моей карты, чтобы перейти к моей карте Google.
Если кто-то заинтересован, я использую: 2Amigos: Yii2 Google Maps Library
Я не знаю, поддерживает ли он в настоящее время заполнение карты данными JSONP, но я, вероятно, продолжу ее, если придется.