GuzzleHttp 在使用本地主机时挂起

GuzzleHttp Hangs When Using Localhost

这是一个简单的代码片段,但它只是挂起并且没有响应。

    $httpClient = new GuzzleHttp\Client(); // version 6.x

    $headers = ['X-API-KEY' => '123456'];

    $request = $httpClient->request('GET', 'http://localhost:8000/BlogApiV1/BlogApi/blogs/', $headers);
    $response = $client->send($request, ['timeout' => 2]);

    echo $request->getStatusCode();
    echo $request->getHeader('content-type');
    echo $request->getBody();
    die();

非常感谢任何指点。当我在上面尝试使用我的用户名和密码 github api 时,我确实收到了 200 响应和大量信息。

如果 http://localhost:8000/BlogApiV1/BlogApi/blogs 处的脚本运行良好,我敢打赌 X-API-KEY 没有被发送。

如果您查看文档 (http://docs.guzzlephp.org/en/latest/request-options.html#headers),似乎您的选项数组格式不正确。

应该是

 $headers = ['headers' => ['X-API-KEY' => '123456']];

终于解决了。如果您 运行 来自非标准端口,Guzzle(或具体来说是 CURL)将拒绝请求。

此外,这似乎是随机的,有时有效,有时无效。我搬到了 80 端口,瞧,一切正常。

我遇到了同样的问题。我通过如下定义 base_uri 来绕过它。

$client = new \GuzzleHttp\Client([
    'base_uri' => 'http://localhost:8000',
    'defaults' => [
        'exceptions' => false
    ]
]);

$response = $client->get('/api/user/1');

connect_timeout 设置为 false 对我在本地开发 (Laravel) 有用,只是需要很长时间才能完成请求!

$client = new Client([
    'connect_timeout' => false,
    'timeout'         => 30.0, // set higher if timeout still happens
]);

这个问题 已解决 我的问题。 试试这个 -> 将您的 Laravel 文件配置到 IIS 或 XAMPP 服务器中,然后尝试通过您的本地 IP 地址 运行,例如 (192.168.X.X).

问题是在使用 php artisan serve 时,它使用 PHP 服务器,即 single-threaded

The web server runs only one single-threaded process, so PHP applications will stall if a request is blocked.

你可以这样做solution:

When making calls to itself the thread blocked waiting for its own reply. The solution is to either seperate the providing application and consuming application into their own instance or to run it on a multi-threaded webserver such as Apache or nginx.

或者,如果您正在寻找快速修复来测试您的更新 - 您可以通过打开两个命令提示符来完成此操作。第一个是 运行ning php artisan serve(本地我的默认端口是 8000,您将 运行ning 您的网站 http://localhost:8000)。第二个会 运行 php artisan serve --port 8001.

然后您将 post 请求更新为:

$request = $httpClient->request('GET', 'http://localhost:8001/BlogApiV1/BlogApi/blogs/', $headers);

这应该有助于您的测试,直到您能够将所有内容放在服务器或本地虚拟主机上。

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

php artisan服务\默认端口8000 \ 在另一个控制台 php artisan 服务 --port=8001

$client->request('GET', 'http://localhost:8001/api/tests')