Guzzle 无法向本地主机(端口:80、8000、8080 等)发出 GET 请求

Guzzle Cannot make GET request to the localhost (port: 80, 8000, 8080, etc )

目前正在使用 Laravel 5.5 和 laravel 安装程序附带的 Guzzle。

我正在尝试发出 GET 请求(其他 HTTP 请求也会出错)但似乎不起作用。

此代码无效:

public function callback(Request $request)
{
    $code = $request->code;

    $client = new Client(['exceptions' => false]);

    try {
      $response = $client->request('GET', 'http://localhost/api/tests');
        // $response = $http->request('POST', Config::get('app.url') . '/oauth/token', [
        //     'form_params' => [
        //         'grant_type' => 'authorization_code',
        //         'client_id' => Config::get('oauth_client.client_id'),
        //         'client_secret' => Config::get('oauth_client.client_secret'),
        //         'redirect_uri' => Config::get('oauth_client.redirect_uri'),
        //         'code' => $code,
        //     ],
        // ]);
        // return json_decode((string) $response->getBody(), true);
    } catch (\Exception $e) {
        dd($e);
    }
    dd($response->getBody());
    return;
}

但是下面这段代码工作得很好

public function callback(Request $request)
{
    $code = $request->code;

    $client = new Client(['exceptions' => false]);

    try {
      $response = $client->request('GET', 'https://www.google.co.id');
        // $response = $http->request('POST', Config::get('app.url') . '/oauth/token', [
        //     'form_params' => [
        //         'grant_type' => 'authorization_code',
        //         'client_id' => Config::get('oauth_client.client_id'),
        //         'client_secret' => Config::get('oauth_client.client_secret'),
        //         'redirect_uri' => Config::get('oauth_client.redirect_uri'),
        //         'code' => $code,
        //     ],
        // ]);
        // return json_decode((string) $response->getBody(), true);
    } catch (\Exception $e) {
        dd($e);
    }
    dd($response->getBody());
    return;
}

我不明白为什么我的 Guzzle 能够请求 google.com 但无法连接到我自己的本地主机服务器(所有端口)。

任何帮助将不胜感激。

谢谢,

'CURLOPT_SSL_VERIFYPEER' 选项设置为 false

public function callback(Request $request)
{
    $code = $request->code;

    $client = new Client(['exceptions' => false, 'CURLOPT_SSL_VERIFYPEER' => false]);

    try {
      $response = $client->request('GET', 'http://localhost/api/tests');
        // $response = $http->request('POST', Config::get('app.url') . '/oauth/token', [
        //     'form_params' => [
        //         'grant_type' => 'authorization_code',
        //         'client_id' => Config::get('oauth_client.client_id'),
        //         'client_secret' => Config::get('oauth_client.client_secret'),
        //         'redirect_uri' => Config::get('oauth_client.redirect_uri'),
        //         'code' => $code,
        //     ],
        // ]);
        // return json_decode((string) $response->getBody(), true);
    } catch (\Exception $e) {
        dd($e);
    }
    dd($response->getBody());
    return;
}

为我的开发服务器使用 Apache2 和虚拟主机解决了这个问题,这种方法比对我的 Guzzle 参数进行任何更改更现实。

所以我的结论是最好使用真正的网络服务器(Nginx、Apache)而不是手工服务。

它不起作用的原因是 php artisan serve 使用 PHP 内置网络服务器,这是 single threaded. So if you run your application it cannot make another request (your Guzzle request) until it finishes the initial request. That is why it hangs (as mentioned here)。

一个解决方案是(如您所指出的)使用真正的多线程网络服务器。

但是如果你仍然想使用 php artisan serve 而不是像 Nginx 这样的网络服务器,有一个简单的解决方案(我已经在 another issue 中发布):

您可以 运行 另一个具有另一个端口的 Web 服务器实例,并将您的应用程序配置为在连接到您的 API 时使用此 base_uri:

php artisan serve \ defaults to port 8000
\ in another console
php artisan serve --port=8001
$client->request('GET', 'http://localhost:8001/api/tests')