Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/285.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 我可以向本地LaravelAPI发送GET请求,但所有POST请求都失败_Php_Laravel_Api_Authentication_Post - Fatal编程技术网

Php 我可以向本地LaravelAPI发送GET请求,但所有POST请求都失败

Php 我可以向本地LaravelAPI发送GET请求,但所有POST请求都失败,php,laravel,api,authentication,post,Php,Laravel,Api,Authentication,Post,我有一个基本的Laravel API,我正在尝试设置。我已经设置了一个CORS中间件,并且正在从不同的(本地)域向API发出请求(即,aaa.host是一个React前端,它向bbb.hostLaravel API后端发出Axios请求) 所有GET请求都成功通过API并返回响应,但我尝试的任何POST请求都失败。我的理解是,在Laravel中,只有web请求才需要CSRF令牌,而不是API请求。因此,我无法理解我遗漏了什么,以及为什么POST请求没有通过。如果我将POST路线更改为GET路线,

我有一个基本的Laravel API,我正在尝试设置。我已经设置了一个CORS中间件,并且正在从不同的(本地)域向API发出请求(即,
aaa.host
是一个React前端,它向
bbb.host
Laravel API后端发出Axios请求)

所有GET请求都成功通过API并返回响应,但我尝试的任何POST请求都失败。我的理解是,在Laravel中,只有web请求才需要CSRF令牌,而不是API请求。因此,我无法理解我遗漏了什么,以及为什么POST请求没有通过。如果我将POST路线更改为GET路线,它会立即生效,因此这是POST路线这一事实似乎是个问题

以下是Chrome控制台中失败的POST请求的示例:

我已经看过了LaravelAPI文档,但我不明白我遗漏了什么。有人有什么想法吗?另外,为了它的价值,我使用了Laravel 5.8.29。多谢各位


编辑:下面是
路由/api.php
的样子:

Route::middleware(['cors'])->group(function () {
    Route::post('/missing-subpath-on-purpose/item/create', 'SomeController@createItem');
});

同样,如果我将
Route::post
更改为
Route::get
,并发出Axios get请求而不是post,那么它可以正常工作。

非常感谢nice_dev发现真正的问题并帮助我解决它。结果表明,LaravelAPI很好,从Postman向其发送POST请求也很好

问题在于浏览器本身。如果发送内容类型为
application/json
的POST请求,浏览器将强制执行两个请求,这会导致各种问题。(我目前不知道这样做的原因,但我相信浏览器制造商有他们这样做的理由。)

然而,通过将浏览器中所有Axios请求的默认内容类型更改为
application/x-www-form-urlencoded
,它解决了我的问题。多谢各位


Edit:在玩了更多之后,我意识到我确实想发出
application/json
请求,但这样做会导致上述CORS问题

为了解决这个问题,我在Laravel中创建了以下CORS中间件:

<?php

    namespace App\Http\Middleware;

    use Closure;

    class Cors {
        public function handle($request, Closure $next) {
            header('Access-Control-Allow-Headers: *');
            header('Access-Control-Allow-Methods: *');
            header('Access-Control-Allow-Origin: *');

            return $next($request);
        }
    }

我犯的错误是CORS中间件不是全局中间件的一部分,而是导致问题的路由中间件。

路由是在routes/api.php中声明的吗?好的,邮递员会给出什么响应?我想对于您的路由上的飞行前请求也需要选项请求?因为它是跨域的,浏览器将发送飞行前请求,以检查您是否有权访问它。
Route::匹配(['OPTIONS','POST'])吗
help?您必须在CORS中间件本身中处理选项请求。@nice\u dev,您一针见血。非常感谢。需要一些测试来验证,但是浏览器正在停止请求,因为内容类型是
application/json
。这是一个浏览器的东西,这就是邮递员工作的原因。我将Axios请求的默认内容类型更改为
application/x-www-form-urlencoded
,它成功了。非常感谢你。
protected $middleware = [
    ..., // Other middleware here.
    \App\Http\Middleware\Cors::class,
];