【问题标题】:php file_get_contents($url) & turns into &php file_get_contents($url) & 变成 &
【发布时间】:2015-07-19 03:44:44
【问题描述】:

我正在尝试像这样向 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 错误请求。

问题当然是当 '&' 变成 '&' 时。

【问题讨论】:

  • 您确定这是问题所在吗?因为直接访问该网址可以正常工作。
  • 也许不是。但还有什么可能是它没有返回文件内容而是错误的原因。
  • 这可能会回答你的问题:stackoverflow.com/questions/3710147/…
  • PHP 7.0 中似乎有一个错误导致有效的 URL 字符串出现这种情况。切换到 7.1 即可解决。

标签: php url file-get-contents url-encoding ampersand


【解决方案1】:

发布这个是因为它最适合我。我知道这是一个老问题。

我发现在使用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);

编辑:刚刚看到@joshi的回答(实际上是按照链接),并且在那里使用了http_build_query。

【讨论】:

    【解决方案2】:

    当您发送的参数之一不是urlencoded 时,可能会发生这种情况。

    当 php 看到格式错误的 url(例如:带有空格或其他 url 黑名单字符)时,它 urlencode 就是完整的请求。

    【讨论】:

      【解决方案3】:

      看来您需要定义一个用户代理。 试试这个;

      $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_contentsstream_context_create(用于使用标头)文档

      【讨论】:

      • 它转储 bool(false)
      • 那么你有一个不同的问题。我没关系。我得到了cURLfile_get_contents 的结果
      • 它不适用于 curl,但编辑后的 ​​file_get_contents,WORKED。但请您描述一下正在发生的事情。
      • API 期望在不设置用户代理的情况下设置User Agent,它根本不起作用。我只是设置用户代理,以便 API 输出具有给定参数的结果。
      • 好的。那太棒了。谢谢一百万!
      【解决方案4】:

      尝试将双引号替换为单引号。这是此处列出的最简单的答案:

      php file_get_contents and &

      排名靠前的涉及更多,但可能是更安全的选择。

      【讨论】:

        【解决方案5】:

        试一试:

        $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;
        

        【讨论】:

          【解决方案6】:

          您可以使用以下方法恢复 htmlspecialchars:

          htmlspecialchars_decode();
          

          尝试像这样调用file_get_contents

          file_get_contents(htmlspecialchars_decode($url));

          【讨论】:

            猜你喜欢
            • 2013-05-10
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2021-12-28
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多