PHP : file_get_contents 工作不正常

PHP : file_get_contents not working properly

我有一个 html 页面,它向 php 发送获取请求。 这是 php 文件

中的代码片段
<?php
    // Create a stream
    $opts = array(
      'http'=>array(
        'method'=>'GET',
      )
    );

    $context = stream_context_create($opts);
    //echo("http://services.my511.org/Transit2.0/GetNextDeparturesByStopName.aspx?token={$_GET['token']}&agencyName={$_GET['agency']}&stopName={$_GET['stopname']}");

    // Open the file using the HTTP headers set above
    $file = file_get_contents("http://services.my511.org/Transit2.0/GetNextDeparturesByStopName.aspx?token={$_GET['token']}&agencyName={$_GET['agency']}&stopName={$_GET['stopname']}", false, $context);
    //$file = file_get_contents("http://services.my511.org/Transit2.0/GetNextDeparturesByStopName.aspx?token=123-456-789&agencyName=SF-MUNI&stopName=The%20Embarcadero%20and%20Folsom%20St", false, $context);
    echo(json_encode(simplexml_load_string($file)));
?>

开发者控制台输出:

Warning: file_get_contents(http://services.my511.org/Transit2.0/GetNextDeparturesByStopName.aspx?token=123-456-789&amp;amp;agencyName=BART&amp;amp;stopName=Powell St. (SF)): failed to open stream: HTTP request failed! HTTP/1.1 400 BAD_REQUEST

从开发者控制台输出可以看出,在发送的 url 请求中有 BART&amp;amp;stopName amp;amp;被插入 url 而我没有这样做。请求因此失败。有什么解决办法吗?

试试这个:

$data = array('token'=>$_GET['token'],
          'stopname'=>$_GET['stopname'],
          'agency'=>$_GET['agency'],
);
$url = "http://services.my511.org/Transit2.0/GetNextDeparturesByStopName.aspx?".$data;
$file = file_get_contents($url, false, $context);
echo(json_encode(simplexml_load_string($file)));

注意:我已根据您的评论修改了我的答案。

试试下面的代码,这将确保您的内容是正确的 URI 编码。

$params = [
    'token' => $_GET['token'],
    'agencyName' => $_GET['agency'],
    'stopName' => $_GET['stopname']
];

$file = file_get_contents(sprintf("http://services.my511.org/Transit2.0/GetNextDeparturesByStopName.aspx?%s", http_build_query($params));
echo(json_encode(simplexml_load_string($file)));

你可以尝试用这种方式清理url:

<?php
    // Create a stream
    $opts = array(
      'http'=>array(
        'method'=>'GET',
      )
    );



    $context = stream_context_create($opts);
    $url= "http://services.my511.org/Transit2.0/GetNextDeparturesByStopName.aspx?";
    $query =  array(
        "token" =>$_GET['token'],
        "agencyName"=>$_GET['agency'],
        "stopName"=>$_GET['stopname']
        );

    $url = $url.http_build_query($query);
    $url = rawurldecode($url);
    print_r($url);

    $file = file_get_contents($url, false, $context);
    echo(json_encode(simplexml_load_string($file)));
?>