首頁  >  問答  >  主體

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粉765570115170 天前3523

全部回覆(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
  • 取消回覆