首页  >  问答  >  正文

PHP HTTP 请求忽略参数

在开始提问之前,我要提到的是,在离开 PHP 很长一段时间后,我正在重新学习 PHP。请温柔一点。另外,我知道我可以使用像curl 这样的库来完成其中一些事情,但我想了解PHP 本身是如何工作的。

我正在尝试向 Microsoft API(身份平台)提交 http GET 请求。以下是我的代码:

<?php
$data = array (
        'client_id' => '6731de76-14a6-49ae-97bc-6eba6914391e',
        'state' => '12345',
        'redirect_uri' => urlencode('http://localhost/myapp/permissions')
    );

    $streamOptions = array('http' => array(
        'method' => 'GET',
        'content' => $data
    ));

    $streamContext = stream_context_create($streamOptions);
    $streamURL = 'https://login.microsoftonline.com/common/adminconsent';
    $streamResult = file_get_contents($streamURL, false, $streamContext);
    echo $streamResult;
?>

当我尝试执行上面的代码时,我得到: 错误片段

相反,使用以下代码,http 请求工作正常:

<?php        
    $streamURL = 'https://login.microsoftonline.com/common/adminconsent?client_id=6731de76-14a6-49ae-97bc-6eba6914391e&state=12345&redirect_uri=http://localhost/myapp/permissions';
    $streamResult = file_get_contents($streamURL);
    echo $streamResult;
?>

任何人都可以提供有关为什么第一个示例失败而第二个示例成功的见解吗?我的想法是一定存在某种语法错误。提前致谢。

P粉765570115P粉765570115220 天前3626

全部回复(1)我来回复

  • P粉827121558

    P粉8271215582024-04-06 09:01:08

    content 参数用于请求正文,适用于 POST 和 PUT 请求。但 GET 参数不会出现在正文中,而是直接出现在 URL 中。因此,您的第一个示例只是向基本 URL 发出 GET 请求,根本不带任何参数。另请注意,method 参数已默认为 GET,因此您可以跳过整个流位。

    您可以像这样构建 URL:

    $urlBase = 'https://login.microsoftonline.com/common/adminconsent';
    $data = [
        'client_id' => '...',
        'state' => '12345',
        'redirect_uri' => 'http://localhost/myapp/permissions',
    ];
    $url = $urlBase . '?' . http_build_query($data);

    然后就是:

    $content = file_get_contents($url);

    或者只是将所有内容塞进一个语句中:

    $content = file_get_contents(
        'https://login.microsoftonline.com/common/adminconsent?' .
        http_build_query([
            'client_id' => '...',
            'state' => '12345',
            'redirect_uri' => 'http://localhost/myapp/permissions',
        ])
    );

    或者使用$url来提供curl_init()或Guzzle或类似的。

    回复
    0
  • 取消回复