Laravel Fortify 不响应 HTTP 代码,而是响应实际路由,即使我将注册请求作为 XHR 发送

问题描述

背景

使用 Postman,我将以下字段发送到 URL http://mywebsite/register 以在数据库注册用户

  • 电子邮件

  • 密码

  • password_confirmation

  • 姓名

根据文档 https://laravel.com/docs/8.x/fortify#registration(我从中找到了上述字段),Fortify 已经定义了路由 register,所以我不需要自己定义它。

根据文档和我的需要,我不需要创建注册表:我直接使用 Postman 将这些注册数据作为 XHR POST 请求数据发送到 Laravel Fortify 的路由 /register。此外,我不需要 Fortify 来返回视图,因此我已禁用它们 (https://laravel.com/docs/8.x/fortify#disabling-views)。事实上,我只是等待我将在 Postman 的返回数据中看到的 HTTP 代码响应(见下文)。

Fortify 应该返回什么

因为我已经禁用了视图并且因为我发送了 XHR POST 请求(在 Postman 中,我将这个 HTTP 标头与注册请求一起发送:X-Requested-With = XMLHttpRequest):

如果注册尝试成功,Fortify 会将用户重定向到通过应用程序的 fortify 配置文件中的 home 配置选项配置的 URI。 如果登录请求是 XHR 请求,将返回 200 HTTP 响应。

如果请求不成功,用户将被重定向注册屏幕,验证错误将通过共享的 $errors Blade 模板变量提供给您。 或者,对于 XHR 请求,验证错误将与 422 HTTP 响应一起返回。

(https://laravel.com/docs/8.x/fortify#registration)

Fortify 实际返回的内容

它正确地注册用户。但是我在 Postman 中看到的结果是 Symfony\\Component\\HttpKernel\\Exception\\NotFoundHttpException。事实上,Fortify 正试图达到主视图。

问题

为什么 Fortify 似乎仍然尝试访问返回的视图路由(未定义,因为我不需要它们),因为我的请求正确地是 XHR POST 请求并且因为我在 Fortify 配置文件中禁用了视图?

解决方法

将配置变量视图设置为 false 将不起作用,因为它只会禁用渲染强化的视图文件,如登录页面、注册页面、重置密码页面等。

Fortify 路由默认使用中间件 [web],您需要在将视图设置为 false 的同一配置文件中将此中间件值设置为 [api]。

,

我想我在 Fortify 文档 (https://laravel.com/docs/8.x/fortify#registration) 中发现了一些“有趣”的东西。那里有些不完整。我想我已经找到了文档中缺少的东西!

我解释一下。

就我而言,手机应用显示了一个注册表单。它将 Fortify 的注册必填字段(如 email,password,confirmation_password,...)发送到 Fortify 定义的 URL <LaravelSite>/register。 Fortify 成功注册用户并将其重定向到家乡路由。 但是,我没有定义任何家庭路线,因为正如您所理解的,这个 Laravel 站点是一个 API。 结果 => 我有这个错误:Symfony\\Component\\HttpKernel\\Exception\\NotFoundHttpException

我遵循了文档:我已禁用视图(在 Fortify 配置文件中)。我已正确指定电话应用程序(实际上是 Postman)发送的请求是 XHR 请求(实际上,我已发送标头 X-Requested-With = XMLHttpRequest)。 因此 Fortify 应该返回一个 HTTP 代码(此处为 200),而不是尝试返回主 URL。

文档中缺少什么? ======>>>> 中间件 RedirectIfAuthenticated 被执行。在其句柄方法中有一个重定向:return redirect(RouteServiceProvider::HOME);。为了使 Fortify 正常工作,必须通过注释禁用此行。

Fortify 文档应包含类似上述句子的内容。

应该在他们的 Github 存储库中创建 PR 或问题。

编辑:我们还必须发送此 HTTP 标头:Accept: application/json(否则在注册成功的情况下,它仍会显示 404)

,

顺便说一下,我遇到了完全相同的问题。经过 30 分钟的在线搜索,我最终检查了我信任的 Laracast 数据库,并且确实找到了一个 5 分钟的视频,向我展示了如何(以某种方式)解决问题。

https://laracasts.com/series/laravel-authentication-options/episodes/15

简单地说,您需要做的就是在您的 register 文件中添加一个 routes/api.php 路由。可以从 Fortify 供应商目录中复制该路线的代码: vendor/laravel/fortify/routes/routes.php。复制第 72/73 行的注册路线。将其粘贴到 api.php 中。立即将您的请求发布到 api/register,它会像处理视频一样工作。

希望有帮助

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...