file_get_contents () возвращает FALSE, а простой запрос GET через Chrome возвращает JSON данные - PullRequest
0 голосов
/ 06 февраля 2020

Я не уверен, почему у меня такое поведение? Я пытаюсь реализовать веб-API Blockchain.com в моем скрипте PHP. Их документация гласит , что я должен использовать file_get_contents PHP функцию, чтобы запросить ее, что я делаю так:

$xpub = "xpub123455";
$callback_url = "https://example.com";
$APIKey = "12345";
$url = "https://api.blockchain.info/v2/receive?xpub=".urlencode($xpub).'&callback='.urlencode($callback_url).'&key='.urlencode($APIKey);
//echo("URL: ".htmlentities($url)."<br><br>");
$res = @file_get_contents($url);
if($res)
{
    echo("RES: ".htmlentities(var_export($res, true)));
}
else
{
    $err = error_get_last();
    echo("err: ".($err && isset($err['message']) ? $err['message'] : "-"));
}

В этом случае file_get_contents возвращает false и если я затем вызываю error_get_last, я получаю следующую ошибку:

err: file_get_contents (-url-): не удалось открыть поток: сбой HTTP-запроса! HTTP / 1.1 401 Unauthorized

Но если я просто скопирую URL, который передается на file_get_contents, и вставлю его в адресную строку для Chrome:

https://api.blockchain.info/v2/receive?xpub=xpub123455&callback=https%3A%2F%2Fexample.com&key=12345

возвращает действительные JSON данные:

enter image description here

Почему эти два выхода отличаются? И как я могу получить JSON ответ от file_get_contents?

1 Ответ

1 голос
/ 06 февраля 2020

Функция allow_url_fopen, вероятно, ограничена.

Лучше использовать cURL вместо file_get_contents:

function url_get_contents ($Url) {
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $Url);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    $output = curl_exec($ch);
    curl_close($ch);
    return $output;
}

, тогда вы можете использовать эту функцию:

$res = @url_get_contents($url);
...