【发布时间】:2021-02-06 15:29:12
【问题描述】:
我正在尝试设置一个基本的 Laravel API。我已经设置了一个 CORS 中间件,我正在从不同的(本地)域向 API 发出请求(即,aaa.host 是一个 React 前端,向 bbb.host Laravel API 后端发出 Axios 请求)。
所有 GET 请求都成功通过 API 并返回响应,但我尝试的任何 POST 请求都失败。我的理解是 CSRF 令牌仅在 Laravel 中用于 Web 请求,而不是 API 请求。因此,我无法理解我缺少什么以及为什么 POST 请求没有通过。如果我将 POST 路由更改为 GET 路由,它会立即起作用,因此它是 POST 路由这一事实似乎是问题所在。
下面是失败的 POST 请求在 Chrome 控制台中的示例:
我查看了 Laravel API 文档,但我不明白我缺少什么。有没有人有任何想法?另外,为了它的价值,我使用的是 Laravel 5.8.29。谢谢。
编辑:这是routes/api.php 的样子:
Route::middleware(['cors'])->group(function () {
Route::post('/missing-subpath-on-purpose/item/create', 'SomeController@createItem');
});
同样,如果我将 Route::post 更改为 Route::get 并发出 Axios GET 请求而不是 POST,它可以正常工作。
【问题讨论】:
-
路由是否在routes/api.php中声明?
-
好的,你从 Postman 那里得到什么回应?
-
我认为您路线上的飞行前请求也需要 OPTIONS 请求?
-
好吧,因为它是跨域的,浏览器会发送一个预检请求来检查你是否被授权访问它。
Route::match(['OPTIONS','POST'])有帮助吗?您必须在 CORS 中间件本身中处理选项请求。 -
@nice_dev,你一针见血。谢谢你。需要进行一些测试来验证,但浏览器停止了请求,因为 Content-Type 是
application/json。那是浏览器的事情,这就是 Postman 工作的原因。我将 Axios 请求的默认 Content-Type 更改为application/x-www-form-urlencoded并且它有效。非常感谢。
标签: php laravel api authentication post