php Laravel 5.8 POST请求始终抛出欢迎页面

30byixjq  于 2023-01-12  发布在  PHP
关注(0)|答案(6)|浏览(121)

我尝试使用postman测试我的API,但当我点击POST请求时,它总是把我扔到欢迎页面。我已经在里面设置了XSRF令牌,但仍然不起作用。
这是我的api.php路由:

Route::middleware('auth:api')->get('/user', function (Request $request) {
    return $request->user();
});
Route::resource('products/{product}/feedbacks', 'FeedbackController');

这是我在FeedbackController中的存储方法:

/**
 * Store a newly created resource in storage.
 *
 * @param  \App\Http\Requests\StoreFeedback  $request
 * @return \Illuminate\Http\Response
 */
public function store(Product $product, StoreFeedback $request)
{
   $product->addFeedback(
      $request->validated()
   );

   return response()->json([
      "status" => "success",
      "message" => "Your feedback has been submitted."
   ], 200);
}

下面是我的web.php文件:

Route::get('/', function () {
    return view('welcome');
});

Auth::routes();

Route::get('/home', 'HomeController@index')->name('home');

Route::resource('product-categories', 'ProductCategoryController')->parameters([
    'product_category' => 'productCategory'
]);

Route::resource('product-sub-categories', 'ProductSubCategoryController')->parameters([
    'product_sub_category' => 'productCategory'
]);

这是我的 Postman 请求的截图:Link to the screenshot

gzjq41n4

gzjq41n41#

POST请求总是抛出欢迎页面

问题出在App\Http\Requests\StoreFeedback类中。

如何?

因为你是通过表单验证器传递请求的,这会使表单请求无效,这就是为什么要将请求传递回之前的URL,默认情况下会变成/

下面的层次结构

  • 使表单无效
  • 查找上一个URL
  • URL解析程序

但是,如果您想获得错误,只需将HEADER Accept:application/json传递给request HEADER,您就会获得错误。
原因:此处处理了验证异常

sqxo8psd

sqxo8psd2#

我认为它显示相同的页面是因为您使用的是Route::resource,如Question中所述,
RESTful资源控制器为您设置一些默认路由,甚至为它们命名。

Route::resource('users', 'UsersController');

为您提供以下命名路由:

Verb          Path                        Action  Route Name
GET           /users                      index   users.index
GET           /users/create               create  users.create
POST          /users                      store   users.store
GET           /users/{user}               show    users.show
GET           /users/{user}/edit          edit    users.edit
PUT|PATCH     /users/{user}               update  users.update
DELETE        /users/{user}               destroy users.destroy

我的猜测是:基本上就是一遍又一遍地调用FeedbackController中的index()函数
将您的路线更改为:

Route::post('products/{product}/feedbacks', 'FeedbackController@store');

编辑将控制器功能更改为:

public function store(Request $request)
{
   dd($request->body); // or the key you send it on the postman
}

让我们看看你的本事

ugmeyewa

ugmeyewa3#

我刚发现问题,就像ssi-anik先生说的一样,它来自app\Http\Requests\StoreFeedback。我不知道为什么布尔验证,当我输入truefalse时,它失败了,并将我重定向到欢迎页面。
相反,我使用了01,它接受参数并正常工作。

fhg3lkii

fhg3lkii4#

如上所述,这是因为表单验证器发生,您也可以使用中间件修复此问题,首先创建一个中间件:

php artisan make:middleware JsonRequestMiddleware

更新中间件的句柄方法

public function handle(Request $request, Closure $next)
    {
        $request->headers->set("Accept", "application/json");
        return $next($request);
    }

然后将此中间件添加到app/Http/Kernel

protected $middleware = [
        ...
        \App\Http\Middleware\JsonRequestMiddleware::class,
       ...
]
kb5ga3dv

kb5ga3dv5#

我遇到了同样的问题,但这是我的错。我没有添加正确的标题。
确保你指定了“内容类型”和“接受”。两者都应该设置为“application/json”。见下图。
希望这个有用。
Postman Headers

2j4z5cfb

2j4z5cfb6#

我的解决方案,在请求中添加failedValidation函数

public function failedValidation(Validator $validator) {
    throw new HttpResponseException(response()->json([
        'success'   => false,
        'message'   => 'Validation errors',
        'data'      => $validator->errors()
    ]));
}

相关问题