【问题标题】:GuzzleHttp\Client don't return any responseGuzzleHttp\Client 不返回任何响应
【发布时间】:2019-11-29 11:59:01
【问题描述】:

我正在使用来自 official docs 的护照创建身份验证 api,但我一直无法发送 GuzzelHttp 请求

我做的和文档一模一样,但是当我想用邮递员测试时没有返回结果,它只是不停地加载

这是我的代码 我的控制器

$user = new User();
        $user->email = $request->email;
        $user->name = $request->name;
        $user->password = bcrypt($request->password);
        $user->save();

        $http = new Client;

        $response = $http->post('http://localhost:8000/oauth/token', [
            'form_params' => [
                'grant_type' => 'password',
                'client_id' => 2,
                'client_secret' => 'x2ESrkADoQEaQ91iMW9kKiIvjKo0LL4RxlUtqtmy',
                'password' => $request->password
            ],
        ]);
        dd($response);

        return response([
            'success'=> true,
            'successMessageKey' => 'userCreatedSuccessfully' ,
            'data'=>json_decode((string) $response->getBody(), true)
        ]);

还有我的路线

Route::post('users/register',[
'uses' => 'Api\AuthController@register'
]);

当我运行我的路线时,我没有得到这样的结果并卡在加载中

【问题讨论】:

  • 尝试在 Postman 中将其从 raw 更改为 x-www-form-urlencoded 并以这种方式添加参数。
  • 我试过但同样的问题:(

标签: php laravel guzzle


【解决方案1】:

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

Web 服务器只运行一个单线程进程,因此如果请求被阻止,PHP 应用程序将停止。

你可以这样做solution:

当调用自身时,线程阻塞等待自己的回复。解决方案是将提供应用程序和消费应用程序分离到它们自己的实例中,或者在多线程网络服务器(例如 Apache 或 Nginx)上运行它。

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

然后您将发布请求更新为:

    $response = $http->post('http://localhost:8001/oauth/token', [
        'form_params' => [
            'grant_type' => 'password',
            'client_id' => 2,
            'client_secret' => 'x2ESrkADoQEaQ91iMW9kKiIvjKo0LL4RxlUtqtmy',
            'password' => $request->password
        ],
    ]);

这应该有助于您的测试,直到您能够在服务器或本地虚拟主机上进行所有操作。

【讨论】:

    【解决方案2】:

    我在你的代码中发现了问题

    请检查您发送给 auth/token 的参数。您的请求中缺少用户名

    【讨论】:

    • 是的,我知道我删除它只是为了测试,因为我只想看到一个响应,所以我试图删除它以查看( parameterMissing )响应,但我什么也没看到跨度>
    【解决方案3】:

    尝试在 Postman 的参数中包含 password_confirmation。这就是我在 laravel 护照项目中所做的

    【讨论】:

    • 问题不在于参数,因为我在邮递员的 guzzle 中尝试了相同的请求,它工作正常,这里的问题是 guzzle
    • 啊,好吧。尝试:而不是 $http = new Client;... 把这个 $http = new GuzzleHttp\Client
    【解决方案4】:

    您需要将 form_params 的数组作为 json 传递

    例如

    $response = $http->post('http://localhost:8000/oauth/token', [
                'form_params' => json_encode([
                    'grant_type' => 'password',
                    'client_id' => 2,
                    'client_secret' => 'x2ESrkADoQEaQ91iMW9kKiIvjKo0LL4RxlUtqtmy',
                    'password' => $request->password
                ]),
     ]);
    

    【讨论】:

    • 我认为它必须是一个数组,我尝试了你的示例,它向我显示了这个错误“消息”:“http_build_query(): 参数 1 应该是数组或对象。给定的值不正确”跨度>
    • 也通过headers => ['Accept' => 'application/json']
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-08
    • 2023-02-14
    • 1970-01-01
    • 2016-03-10
    • 2019-07-26
    • 1970-01-01
    相关资源
    最近更新 更多