У меня возникла проблема с разбором `jsonp 'запроса с json_decode
функции json_decode
php.
Мои вопросы:
а. Что такое функция обратного вызова в «jsonp», если я просто отключу это, или я предполагаю использовать ее каким-то образом. ?
б. Как исправить синтаксическую ошибку, полученную в формате «jsonp»?
Ниже я дал код и ответ, который я получил.
1. Я запрашиваю образец URL с завихрением PHP
$url = 'https://ssl.domain.com/data/4564/d.jsonp'; $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 5); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE); curl_setopt($ch, CURLOPT_USERAGENT, "Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0)"); $feed = curl_exec($ch); curl_close($ch); echo $feed = gzdecode($feed); // Success its displays the jsonp feed
2. Затем я пытаюсь выполнить json_decode полученный вывод, который выдает ошибку 4, что означает JSON_SYNTAX_ERROR , причина, по-моему, состоит в том, что имена типа строки в jsonp не цитируются. например, Categories
, Name
, Position
и т. д.
$json_feed = json_decode($feed); $error = json_last_error(); echo $error; // Throws error no. 4
3. RAW 'jsonp' выводится из URL-адреса.
domain_jsonp_callback({ Categories:[ { Name:"Artifacts", Position:14, Count:70, ImageUrls:{ i100:"//s3-eu-west-1.amazonaws.com/s.domain.com/1.png", i120:"//s3-eu-west-1.amazonaws.com/s.domain.com/2.png", i140:"//s3-eu-west-1.amazonaws.com/s.domain.com/3.png", i180:"//s3-eu-west-1.amazonaws.com/s.domain.com/4.png", i220:"//s3-eu-west-1.amazonaws.com/s.domain.com/5.png", i280:"//s3-eu-west-1.amazonaws.com/s.domain.com/6.png" } } ] });
Что такое функция обратного вызова в «jsonp», если я просто отключу это, или я предполагаю использовать ее каким-то образом. ?
JSON-P – действительно сценарий JavaScript, который состоит из вызова функции с аргументом.
Если вы хотите разобрать его на PHP, то да, вам нужно снять его. Вам также необходимо отключить );
в конце.
б. Как исправить синтаксическую ошибку, полученную в формате «jsonp»?
Вам нужно исправить данные, так что это действительно JSON. Имеющиеся данные – это литерал JavaScript, но он не соответствует подмножеству JavaScript, который соответствует JSON (например, имена свойств не являются строками, но должны быть).
Было бы лучше получить реальный ресурс JSON вместо источника.
Функция обратного вызова предназначена для вызовов JS – это позволяет использовать API в режиме AJAX, не заботясь о той же политике происхождения. Когда JSONP-вызов используется в JS-браузере, он просто вызывает функцию обратного вызова, которая должна быть определена на стороне клиента API.
Когда вы используете JSONP внутри PHP, функция обратного вызова вообще не нужна. Если сервер поддерживает сырые вызовы типа JSON – используйте его, если не линять строки функции обратного вызова, в вашем случае
$jsonData = json_decode(substr($feed, 22, -2));
Не уверен в этом, но я думаю, что имена также должны быть указаны следующим образом:
domain_jsonp_callback({ Categories:[ { "Name":"Artifacts", "Position":14, "Count":70, "ImageUrls":{ "i100":"//s3-eu-west-1.amazonaws.com/s.domain.com/1.png", "i120":"//s3-eu-west-1.amazonaws.com/s.domain.com/2.png", "i140":"//s3-eu-west-1.amazonaws.com/s.domain.com/3.png", "i180":"//s3-eu-west-1.amazonaws.com/s.domain.com/4.png", "i220":"//s3-eu-west-1.amazonaws.com/s.domain.com/5.png", "i280":"//s3-eu-west-1.amazonaws.com/s.domain.com/6.png" } } ] });
PS: Возможно, «Категории» тоже:?