Guzzle无法向localhost发送GET请求(端口:80,8000,8080等)

时间:2018-02-17 11:58:15

标签: php laravel http guzzle artisan

目前使用与laravel安装程序一起使用的Laravel 5.5和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但无法连接到我自己的localhost服务器(到所有端口)。

任何帮助都会非常感激。

谢谢,

3 个答案:

答案 0 :(得分:2)

之所以不起作用,是因为Date = c("8/20/2019","8/20/2019","8/20/2019") Name = c("ABC","CBC","XYLEM") class = c("one","two","three") M=c("1.5","NA","low,lower") F = c("NA","top,topper","2") out = data.frame(Date,Name,class,M,F) 使用PHP内置的Web服务器,而它是single threaded。因此,如果您运行您的应用程序,则在完成初始请求之前,它将无法再发出另一个请求(您的Guzzle请求)。这就是它挂起的原因(如here所述)。

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

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

您可以使用另一个端口运行另一个Web服务器实例,并配置您的应用程序以在连接到API时使用此php artisan serve

base_uri
php artisan serve \\ defaults to port 8000
\\ in another console
php artisan serve --port=8001

答案 1 :(得分:0)

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

所以我的结论是更好地使用真正的网络服务器(Nginx,Apache)而不是工匠服务。

答案 2 :(得分:-1)

'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;
}