php file_get_contents($url) и превращается в

Я пытаюсь сделать запрос к coinbase api следующим образом

$url = "https://api.gdax.com/products/BTC-USD/candles?start=".date($format,$starting_date)."&end=".date($format,$ending_date)."&granularity=".$granularity;

а затем я передаю это в file_get_contents($url), но это дает мне ошибку

file_get_contents(https://api.gdax.com/products/BTC-USD/candles?start=2015-05-07&end=2015-05-08&granularity=900): не удалось открыть поток: HTTP-запрос не выполнен! HTTP/1.1 400 Неверный запрос.

Проблема, конечно, в том, что когда «&» меняется на «&».


person Mubashar Abbas    schedule 08.05.2015    source источник
comment
Вы уверены, что это проблема? так как переход непосредственно к этому URL-адресу работает нормально.   -  person Gerton    schedule 08.05.2015
comment
Может быть нет. но что еще может быть причиной того, что он не возвращает содержимое файла, а вместо этого ошибка.   -  person Mubashar Abbas    schedule 08.05.2015
comment
это может ответить на ваш вопрос: stackoverflow .com/questions/3710147/   -  person Gerton    schedule 08.05.2015
comment
Кажется, в PHP 7.0 есть ошибка, вызывающая это для допустимых строк URL. Переход на 7.1 решает эту проблему.   -  person cioddi    schedule 05.10.2018


Ответы (6)


Кажется, вам нужно определить пользовательский агент. Попробуй это;

$url = "https://api.gdax.com/products/BTC-USD/candles?start=2015-05-07&end=2015-05-08&granularity=900";

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch,CURLOPT_USERAGENT,"Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.13) Gecko/20080311 Firefox/2.0.0.13");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$result = curl_exec($ch);
curl_close($ch);

var_dump($result);

Если вы все еще настаиваете на использовании file_get_contents, тогда все еще можно использовать пользовательский агент;

$url = "https://api.gdax.com/products/BTC-USD/candles?start=2015-05-07&end=2015-05-08&granularity=900";

$options = array(
    "http"=>array(
        "header"=>"User-Agent: Mozilla/5.0 (iPad; U; CPU OS 3_2 like Mac OS X; en-us) AppleWebKit/531.21.10 (KHTML, like Gecko) Version/4.0.4 Mobile/7B334b Safari/531.21.102011-10-16 20:23:10\r\n" // i.e. An iPad
    )
);

$context = stream_context_create($options);
$result = file_get_contents($url, false, $context);
var_dump($result);

Для получения дополнительной информации вы можете проверить file_get_contents и stream_context_create (для использования заголовков)

person Ilgıt Yıldırım    schedule 08.05.2015
comment
он сбрасывает bool(false) - person Mubashar Abbas; 08.05.2015
comment
Тогда у вас другая проблема. Со мной все в порядке. Я получаю результаты как с cURL, так и с file_get_contents - person Ilgıt Yıldırım; 08.05.2015
comment
это не сработало с curl, но отредактированный file_get_contents, WORKED. но не могли бы вы описать, что происходит. - person Mubashar Abbas; 08.05.2015
comment
API ожидает, что User Agent будет установлено без установки пользовательского агента, это просто не работает. Я просто устанавливаю пользовательский агент, чтобы API выдавал результат с заданными параметрами. - person Ilgıt Yıldırım; 08.05.2015
comment
В порядке. Замечательно. Бесконечно благодарен! - person Mubashar Abbas; 08.05.2015
comment
С удовольствием, желаю вам удачи в ваших проектах. - person Ilgıt Yıldırım; 08.05.2015

Публикую это, потому что это сработало лучше всего для меня. Я знаю, что это старый вопрос.

Я обнаружил, что при построении запроса с использованием http_build_query проблема с амперсандом исчезла.

Пример

$url = 'https://example.url';

// http_build_query builds the query from an array
$query_array = array (
    'search' => $string,
    'from' => $from,
    'to' => $to,
    'format' => 'json'
);

$query = http_build_query($query_array);
$result = file_get_contents($url . '?' . $query);

edit: только что увидел ответ @joshi (фактически перешел по ссылке), и там используется http_build_query.

person pusle    schedule 12.09.2017

Это может произойти, если один из параметров, которые вы отправляете, не равен urlencoded.

Когда php видит неправильный URL-адрес (например, с пробелами или другими символами URL-адреса, занесенными в черный список), он urlencode-это полный запрос.

person Ohad Cohen    schedule 02.07.2018

Попробуйте заменить двойные кавычки на одинарные. Это самый простой ответ, указанный здесь:

php file_get_contents и

Верхний более сложный, но, вероятно, более безопасный.

person JoshI    schedule 08.05.2015

Попробуйте:

$url = html_entity_decode($url);
file_get_contents($url);

Подробнее о html_entity_decode

ОБНОВЛЕНО

Попробуйте заменить

& with & in url as below

$url = "https://api.gdax.com/products/BTC-USD/candles?start=".date($format,$starting_date)."&end=".date($format,$ending_date)."&granularity=".$granularity;
person Praveen Dabral    schedule 08.05.2015

Вы можете вернуть htmlspecialchars, используя:

htmlspecialchars_decode();

попробуйте вызвать file_get_contents вот так:

file_get_contents(htmlspecialchars_decode($url));

person Gerton    schedule 08.05.2015