2013-02-10 2 views
0

Я пытаюсь получить JSON данные по следующему адресу:Получить JSon содержимое из диаграммы URL Google

https://chart.googleapis.com/chart?cht=gv&chl=digraph рамочным {1 [цвет = красный]; 2; 3 [цвет = красный]; 4; 5; 6; 7; 8; 9; 10; 11; 12 [цвет = красный]; 13; 14 [цвет = красный]; 15; 16 [цвет = красный]; 17 [цвет = красный]; 2 -> 1; 3 -> 1; 4 -> 1; 5 -> 1; 6 -> 2; 8 -> 9; 9 -> 8; 12 -> 2; 12 -> 3; 12 -> 4; 12 -> 5; 7 -> 6; 7 -> 10; 7 -> 11; 8 -> 7; 13 -> 5; 14 -> 13; 15 -> 6; 16 -> 15; 17 -> 12; 10 -> 4; 11 -> 3; 14 -> 16; 16 -> 17; } & chof = JSON

Я попробовал несколько методов, которые были предложены в других вопросах:

$jsonurl = "https://chart.googleapis.com/chart?cht=gv&chl=digraph framework { 1[color=red]; 2; 3[color=red]; 4; 5; 6; 7; 8; 9; 10; 11; 12[color=red]; 13; 14[color=red]; 15; 16[color=red]; 17[color=red]; 2 -> 1; 3 -> 1; 4 -> 1; 5 -> 1; 6 -> 2; 8 -> 9; 9 -> 8; 12 -> 2; 12 -> 3; 12 -> 4; 12 -> 5; 7 -> 6; 7 -> 10; 7 -> 11; 8 -> 7; 13 -> 5; 14 -> 13; 15 -> 6; 16 -> 15; 17 -> 12; 10 -> 4; 11 -> 3; 14 -> 16; 16 -> 17; }&chof=json" 

//Method 1 
$json = file_get_contents($jsonurl); 
// returns an error from the google page: 400. That’s an error. Your client has issued a malformed or illegal request. That’s all we know 

//Method 2 
$curlSession = curl_init(); 
curl_setopt($curlSession, CURLOPT_URL, $jsonurl); 
curl_setopt($curlSession, CURLOPT_BINARYTRANSFER, true); 
curl_setopt($curlSession, CURLOPT_RETURNTRANSFER, true); 

$json_decoded = json_decode(curl_exec($curlSession)); 
curl_close($curlSession); 
// returns NULL 
// This makes sense if the JSON isn't not returned correctly. I think json_decode() returns NULL if the input is not correct json data. 

//Method 3 
$json = file_get_contents(urlencode($jsonurl)); 
// Gives another error: [function.file-get-contents]: failed to open stream: File name too long 

Если я просто опубликовать исходные данные в формате JSON в моем коде остальные моего алгоритма отлично работает. Дело в том, что в моем фактическом коде URL-адрес динамический, и мне нужно иметь возможность получать данные JSON с URL-адреса.

Это похоже на проблему безопасности с Google. Однако я не знаю, как это решить.

Это мой первый вопрос в Stackoverflow. Пожалуйста, дайте мне знать, если вы хотите узнать больше/если я должен каким-то образом изменить свой вопрос.

Заранее благодарен!

+0

Я не думаю, что ваш URL JSON - это то, что вы думаете. Попробуйте обернуть его в кавычки, чтобы начать с него, поскольку он содержит пробелы и полуколоны, которые являются специальными символами для PHP. – hrunting

+0

Извините, это указано в моем исходном коде, это была опечатка. Я думаю, что данные json - это то, что это какая-то структура данных, которая содержит информацию о диаграмме/изображении. Если вы вставляете URL-адрес в свой браузер, он запрашивает загрузку, содержащую данные. Все, что я хочу сделать, так это содержать эти данные в переменной, поэтому я могу использовать 'json_decode()' на ней и в конечном итоге сделать карту изображения. – Spiderbro

+0

Если вы вставляете этот URL-адрес в свой браузер, ваш браузер преобразует все пробелы и специальные символы в последовательности с символом% -escaped. Попробуйте вставить его в Chrome, а затем скопируйте полученный URL-адрес и используйте этот URL вместо него (в нем не будет пробелов). Похоже, что скобки также должны быть экранированы, какие браузеры обычно не делают. См. Этот ответ: [Как мне избежать URL-манипуляции с PHP cURL?] (Http://stackoverflow.com/questions/5137027/how-do-i-avoid-url-globbing-with-php-curl) – hrunting

ответ

0

Ваш URL-адрес должен быть URI-экранирован для cURL, чтобы использовать его правильно. Если изменить сценарий к этому:

# note that in this string, all special characters (eg. spaces) are %-escaped 
$jsonurl = "https://chart.googleapis.com/chart?cht=gv&chl=digraph%20framework%20{%201[color=red];%202;%203[color=red];%204;%205;%206;%207;%208;%209;%2010;%2011;%2012[color=red];%2013;%2014[color=red];%2015;%2016[color=red];%2017[color=red];%202%20-%3E%201;%203%20-%3E%201;%204%20-%3E%201;%205%20-%3E%201;%206%20-%3E%202;%208%20-%3E%209;%209%20-%3E%208;%2012%20-%3E%202;%2012%20-%3E%203;%2012%20-%3E%204;%2012%20-%3E%205;%207%20-%3E%206;%207%20-%3E%2010;%207%20-%3E%2011;%208%20-%3E%207;%2013%20-%3E%205;%2014%20-%3E%2013;%2015%20-%3E%206;%2016%20-%3E%2015;%2017%20-%3E%2012;%2010%20-%3E%204;%2011%20-%3E%203;%2014%20-%3E%2016;%2016%20-%3E%2017;%20}&chof=json"; 

# your settings here are fine 
$curlSession = curl_init(); 
curl_setopt($curlSession, CURLOPT_URL, $jsonurl); 
curl_setopt($curlSession, CURLOPT_BINARYTRANSFER, true); 
curl_setopt($curlSession, CURLOPT_RETURNTRANSFER, true); 

# XXX: not entirely safe here 
# curl_exec() could dump out something other than JSON if it encounters an error 
# I recommend saving the output of curl_exec($c) separately in case of error 
$json = json_decode(curl_exec($c)); 

$json Затем содержит объект данных, я бы ожидать. Я тестировал это в PHP 5.3.15 на Mac.

+0

Спасибо, этот URL-адрес работает и в моем коде. Однако до сих пор не выяснили, как это сделать. Конвертировать все пробелы в% 20 и все '>' в% 3E, похоже, недостаточно. – Spiderbro

+0

См. Ответ для [url-encodeURI() в PHP?] (Http://stackoverflow.com/questions/4929584/encodeuri-in-php) для метода, который будет принимать заданный URL-адрес и правильно закодировать его. – hrunting

+0

Да, я пробовал это раньше. Такая же ошибка, только то, что работает, это использование google chrome (copy/paste). Это не идеально, но сейчас у меня есть работа для некоторых случаев. Спасибо за помощь! – Spiderbro

Смежные вопросы